实验报告2 动态规划Word文档格式.docx
《实验报告2 动态规划Word文档格式.docx》由会员分享,可在线阅读,更多相关《实验报告2 动态规划Word文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
1.阅读参考代码,理解动态规划算法的主要数据结构;
2.比较动态规划算法和分治算法的异同;
3.比较规划算法和备注算法的异同;
4.针对4.6,4.7两节问题,在已有动态规划算法基础上,编程求解最优解;
【实验原理】
(含相关算法流程图,可写多页)
【实验环境】
微型计算机;
Windows7操作系统;
Codeblocks、vs2012集成开发环境。
【实验过程与结果】
(附主要源码及运行结果截图)
//最长单调子序列问题
#include<
iostream>
#defineMAXLENGTH1000
usingnamespacestd;
intLongestIncreasingSubsequence(intX[],intn,intc[],intline[])
{
intpath[MAXLENGTH];
for(inti=0;
i<
n;
++i)
{
path[i]=i;
}
c[0]=1;
//输入数组
for(inti=1;
c[i]=1;
for(intj=0;
j<
i;
++j)
if(X[i]>
=X[j]&
&
c[j]+1>
c[i])
c[i]=c[j]+1;
path[i]=j;
intmax=0;
intend=-1;
//得到最大和获得最长递增子序列的最后一个元素的索引
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)
cin>
X[i];
intmax=LongestIncreasingSubsequence(X,n,c,line);
cout<
<
"
LongestIncreasingSubsequence'
sLength:
"
max<
endl;
for(inti=max-1;
i>
=0;
--i)
line[i]<
;
//数字三角问题
#include
cmath>
string.h>
using
namespace
std;
int
main()
{
n;
cin
arr[n+1][n+1];
res[n+1][n+1];
memset(arr,
-1,
sizeof(int));
memset(res,
for
(int
i
=
1;
i++)
j
i;
j++)
arr[i][j];
}
//
初始化res结果数组
res[n][i]
arr[n][i];
n
-
i--)
动规填表
res[i][j]
max(res[i+1][j],
res[i+1][j+1])
+
/*
打印res数组
cout
endl;
*/
res[1][1]
//最大路径和值
找出靠右路径
y
arr[1][y]
//顶部最大
2;
从上往下找,只需要比较
和
y+1,相应输出
“最大值下标对应的”
原值
if
(res[i][y]
res[i][y+1])
arr[i][y+1]
y+1;
//更新y
}else{
arr[i][y]
return
0;
【实验小结】
1.分治法与动态规划主要共同点:
二者都要求原问题具有最优子结构性质,都是将原问题分而治之,分解成若干个规模较小(小到很容易解决的程序)的子问题.然后将子问题的解合并,形成原问题的解.
2.分治法与动态规划实现方法:
①分治法通常利用递归求解.
②动态规划通常利用迭代法自底向上求解,但也能用具有记忆功能的递归法自顶向下求解.
3.分治法与动态规划主要区别:
①分治法将分解后的子问题看成相互独立的.
②动态规划将分解后的子问题理解为相互间有联系,有重叠部分.
2.相同点
解决的问题都需要最优子结构
备忘录方法与动态规划和递归的区别:
1、动态规划是自低向上,备忘录方法是自顶向下,递归是自顶向下
2、动态规划每个子问题都要解一次,但不会求解重复子问题;
备忘录方法只解哪些确实需要解的子问题;
递归方法每个子问题都要解一次,包括重复子问题•。
备注:
批阅教师
时间
实验成绩