实验报告2 动态规划.docx
- 文档编号:6692717
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:8
- 大小:91.32KB
实验报告2 动态规划.docx
《实验报告2 动态规划.docx》由会员分享,可在线阅读,更多相关《实验报告2 动态规划.docx(8页珍藏版)》请在冰豆网上搜索。
实验报告2动态规划
算法设计与分析
实验报告
实验名称_____动态规划_____
学 院________数学与计算机学院____
班 级_______信科00000___________
学 号_______6666666666__________
姓 名_____000000________________
2016年 月 日
学 号
姓名
实验日期
实验名称
动态规划
【实验目的】
理解动态规划算法的思想,能灵活利用动态规划算法解决实际计算问题。
【实验内容】
参考源码MatrixChain.cpp,RecurveMatrixChain.cpp,lookupMatrixChain.cpp
1.阅读参考代码,理解动态规划算法的主要数据结构;
2.比较动态规划算法和分治算法的异同;
3.比较规划算法和备注算法的异同;
4.针对4.6,4.7两节问题,在已有动态规划算法基础上,编程求解最优解;
【实验原理】(含相关算法流程图,可写多页)
【实验环境】
微型计算机;
Windows7操作系统;
Codeblocks、vs2012集成开发环境。
【实验过程与结果】(附主要源码及运行结果截图)
//最长单调子序列问题
#include
#defineMAXLENGTH1000
usingnamespacestd;
intLongestIncreasingSubsequence(intX[],intn,intc[],intline[])
{
intpath[MAXLENGTH];
for(inti=0;i { path[i]=i; } c[0]=1; //输入数组 for(inti=1;i { c[i]=1; for(intj=0;j { if(X[i]>=X[j]&&c[j]+1>c[i]) { c[i]=c[j]+1; path[i]=j; } } } intmax=0; intend=-1; //得到最大和获得最长递增子序列的最后一个元素的索引 for(inti=0;i { if(c[i]>max) { max=c[i]; end=i; } } inti=1; //得到的最长递增子序列 line[0]=X[end]; while(path[end]! =end) { line[i++]=X[path[end]]; end=path[end]; } returnmax; } intmain() { intn; intX[MAXLENGTH]; intc[MAXLENGTH]; intline[MAXLENGTH]; while(cin>>n,n! =0) { for(inti=0;i { cin>>X[i]; } intmax=LongestIncreasingSubsequence(X,n,c,line); cout<<"LongestIncreasingSubsequence'sLength: "< for(inti=max-1;i>=0;--i) { cout< } cout< } } //数字三角问题 #include #include #include using namespace std; int main() { int n; cin >> n; int arr[n+1][n+1]; int res[n+1][n+1]; memset(arr, -1, sizeof(int)); memset(res, -1, sizeof(int)); for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { cin >> arr[i][j]; } } // 初始化res结果数组 for (int i = 1; i <= n; i++) { res[n][i] = arr[n][i]; } for (int i = n - 1; i >= 1; i--) { for (int j = 1; j <= i; j++) { // 动规填表 res[i][j] = max(res[i+1][j], res[i+1][j+1]) + arr[i][j]; } } /* // 打印res数组 for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { cout << res[i][j] << " "; } cout << endl; } cout << endl; */ cout << res[1][1] << endl;//最大路径和值 // 找出靠右路径 int y = 1; cout << arr[1][y] << " ";//顶部最大 for (int i = 2; i <= n; i++) { // 从上往下找,只需要比较 y 和 y+1,相应输出 “最大值下标对应的” 原值 if (res[i][y] <= res[i][y+1]) { cout << arr[i][y+1] << " "; y = y+1;//更新y }else{ cout << arr[i][y] << " "; } } cout << endl; return 0; } 【实验小结】 1.分治法与动态规划主要共同点: 二者都要求原问题具有最优子结构性质,都是将原问题分而治之,分解成若干个规模较小(小到很容易解决的程序)的子问题.然后将子问题的解合并,形成原问题的解. 2.分治法与动态规划实现方法: ①分治法通常利用递归求解. ②动态规划通常利用迭代法自底向上求解,但也能用具有记忆功能的递归法自顶向下求解. 3.分治法与动态规划主要区别: ①分治法将分解后的子问题看成相互独立的. ②动态规划将分解后的子问题理解为相互间有联系,有重叠部分. 2.相同点 解决的问题都需要最优子结构 备忘录方法与动态规划和递归的区别: 1、动态规划是自低向上,备忘录方法是自顶向下,递归是自顶向下 2、动态规划每个子问题都要解一次,但不会求解重复子问题;备忘录方法只解哪些确实需要解的子问题;递归方法每个子问题都要解一次,包括重复子问题•。 备注: 批阅教师 时间 实验成绩
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验报告2 动态规划 实验 报告 动态 规划