1、1.阅读参考代码,理解动态规划算法的主要数据结构;2.比较动态规划算法和分治算法的异同;3.比较规划算法和备注算法的异同;4.针对4.6,4.7两节问题,在已有动态规划算法基础上,编程求解最优解;【实验原理】(含相关算法流程图,可写多页)【实验环境】微型计算机;Windows7 操作系统;Code blocks、vs2012集成开发环境。【实验过程与结果】(附主要源码及运行结果截图)/最长单调子序列问题#include #define MAXLENGTH 1000using namespace std;int LongestIncreasingSubsequence(int X, int n,
2、 int c, int line) int pathMAXLENGTH; for (int i = 0; i n; +i) pathi = i; c0 = 1; /输入数组 for (int i = 1; ci = 1; for (int j = 0; j = Xj & cj + 1 ci) ci = cj + 1; pathi = j; int max = 0; int end = -1; /得到最大和获得最长递增子序列的最后一个元素的索引 if (ci max) max = ci; end = i; int i = 1; /得到的最长递增子序列 line0 = Xend; while (p
3、athend != end) linei+ = Xpathend; end = pathend; return max;int main() int n; int XMAXLENGTH; int cMAXLENGTH; int lineMAXLENGTH; while (cin n, n != 0) cin Xi; int max = LongestIncreasingSubsequence(X, n, c, line); cout Longest Increasing Subsequences Length: max = 0; -i) lineistring.husingnamespaces
4、td;intmain()n;cinarrn+1n+1;resn+1n+1;memset(arr,-1,sizeof(int);memset(res,for(inti=1;i+)ji;j+)arrij;/初始化res结果数组resniarrni;n-i-)动规填表resijmax(resi+1j,resi+1j+1)+/*打印res数组coutendl;*/res11/最大路径和值找出靠右路径yarr1y/顶部最大2;从上往下找,只需要比较和y+1,相应输出“最大值下标对应的”原值if(resiyresiy+1)arriy+1y+1;/更新yelsearriyreturn0;【实验小结】1. 分
5、治法与动态规划主要共同点:二者都要求原问题具有最优子结构性质,都是将原问题分而治之,分解成若干个规模较小(小到很容易解决的程序)的子问题.然后将子问题的解合并,形成原问题的解.2. 分治法与动态规划实现方法: 分治法通常利用递归求解. 动态规划通常利用迭代法自底向上求解,但也能用具有记忆功能的递归法自顶向下求解. 3. 分治法与动态规划主要区别: 分治法将分解后的子问题看成相互独立的. 动态规划将分解后的子问题理解为相互间有联系,有重叠部分.2. 相同点解决的问题都需要最优子结构备忘录方法与动态规划和递归的区别:1、动态规划是自低向上 ,备忘录方法是自顶向下,递归是自顶向下2、动态规划每个子问题都要解一次,但不会求解重复子问题;备忘录方法只解哪些确实需要解的子问题;递归方法每个子问题都要解一次,包括重复子问题 。备注:批阅教师时间实验成绩
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1