动态规划算法的应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

动态规划算法的应用

一、实验目的

1.掌握动态规划算法的基本思想,包括最优子结构性质和基于表格的最优值计算方法。

2.熟练掌握分阶段的和递推的最优子结构分析方法。

3.学会利用动态规划算法解决实际问题。

二、实验内容

题目一:数塔问题

给定一个数塔,其存储形式为如下所示的下三角矩阵。在此数塔中,从顶部出发,在每一节点可以选择向下走还是向右走,一直走到底层。请找出一条路径,使路径上的数值和最大。

输入样例(数塔):

9

15

10 6 8

2 18 9 5

19 7 10 4 16

输出样例(最大路径和):

59

三、实验步骤

(1)需求分析

通过动态规划法解决数塔问题。从顶部出发,在每一节点可以选择向下或者向右走,一直走到底层,以找出一条数值最大的路径。

(2)概要设计

本次实验程序主要用到二维数组,以及通过动态规划法进行比较每个数的大小。主要运用两个for循环语句实现动态规划。

(3)详细设计

第一步,输入给定的二维数组并打印出相应的数组:

int array[5][5]={{9},

/* */{12,15},

/* */{10,6,8},

/* */{2,18,9,5},

/* */{19,7,10,4,6}};

int i,j;

for(i=0;i<5;i++)

{

for(j=0;j<5;j++)

cout<

cout<

}

第二步,使用动态规划法思想对数组元素最比较,并保留比较出来的路径。for(j=4;j>0;j--)

{

for(i=0;i<=4;i++)

{

if(array[j][i]>array[j][i+1])

array[j-1][i]=array[j][i]+array[j-1][i];

else

array[j-1][i]=array[j][i+1]+array[j-1][i];

}

}

第三步,输出最大路径的值。

cout<

(4)调试分析

本实验刚开始时我从最后一行开始,每一个数都比较,然后找出最大的再与前一行相加,因此算出来的路径之始终小于59,经过反复验证,我两个数的比较,并修改循环方式,最后得出了正确答案。

(5)测试结果:

四、实验总结

通过本次实验,是我对动态规划这一方法有了更深的了解,和更加熟练的应用。虽然过去编写程序是也经常用到动态规划这一方法,但是当时根本就不了解动态规划是什么,现在知道使用动态规划能够降低工程量并且更重要的是降低运行次数节省运行时间。

五、附录:程序清单

#include

#include

using namespace std;

int main()

{

int array[5][5]={{9},

/* */{12,15},

/* */{10,6,8},

/* */{2,18,9,5},

/* */{19,7,10,4,6}};

int i,j;

for(i=0;i<5;i++)

{

for(j=0;j<5;j++)

cout<

cout<

}

for(j=4;j>0;j--)

{

for(i=0;i<=4;i++)

{

if(array[j][i]>array[j][i+1])

array[j-1][i]=array[j][i]+array[j-1][i];

else

array[j-1][i]=array[j][i+1]+array[j-1][i];

}

}

cout<

return 0;

}

相关文档
最新文档