实验二动态规划算法的应用
一、实验目的
1.掌握动态规划算法的基本思想,包括最优子结构性质和基于表格的最优值计算方法。
2.熟练掌握分阶段的和递推的最优子结构分析方法。
3.学会利用动态规划算法解决实际问题。
二、实验内容
1.问题描述:
题目一:数塔问题
给定一个数塔,其存储形式为如下所示的下三角矩阵。
在此数塔中,从顶部出发,在每一节点可以选择向下走还是向右走,一直走到底层。
请找出一条路径,使路径上的数值和最大。
输入样例(数塔):
9
12 15
10 6 8
2 18 9 5
19 7 10 4 16
输出样例(最大路径和):
59
三、算法设计
void main()
{
申明一个5*5的二维数组;
for(int i=0;i<5;i++)
{
for(int j=0;j<=i;j++)
{
输入数组元素p[i][j];
}
}
for(int k=0;k<5;k++)
{
for(int w=0;w<=k;w++)
{
输出数组元素p[k][w];
}
}
for(int a=4;a>0;a--)
{
for(int s=0;s<=a;s++)
{
if(p[a][s]大于p[a][s+1])
p[a-1][s]等于p[a-1][s]加p[a][s];
else
p[a-1][s] 等于p[a-1][s] 加p[a][s+1];
}
}
输出p[0][0]
}
四.程序调试及运行结果分析
五.实验总结
虽然这个实验比较简单,但是通过这次实验使我更加了解的动态规划法的好处和、,在解决问题时要尝试使用动态规划,这样就有可能得到一种即简单复杂性有不高的算法。
附录:程序清单(程序过长,可附主要部分)
#include<iostream.h>
int main()
{
int m,n;
int p[5][5];
cout<<"输入矩阵的下三角的元素!!"<<endl;
for(int i=0;i<5;i++)
{
for(int j=0;j<=i;j++)
{
cout<<"输入第"<<i+1<<"行"<<j+1<<"列的元素"<<endl;
cin>>p[i][j];
}
}
for(int k=0;k<5;k++)
{
for(int w=0;w<=k;w++)
{
cout<<p[k][w]<<" ";
}
cout<<endl;
}
for(int a=4;a>0;a--)
{
for(int s=0;s<=a;s++)
{
if(p[a][s]>p[a][s+1])
p[a-1][s]=p[a-1][s]+p[a][s];
else
p[a-1][s]=p[a-1][s]+p[a][s+1];
}
}
cout<<"最大路径和为:"<<p[0][0]<<endl;
return 0;
}。