动态规划算法的应用 下载本文

内容发布更新时间 : 2024/5/5 14:11:28星期一 下面是文章的全部内容请认真阅读。

动态规划算法的应用

一、

实验目的

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) 测试结果:

输出结果 array[0][0] array[j-1][i]=array[j][i+1]+array[j-1][i]; if(array[j][i]> array[j][i+1]) Y N j从4到0循环 i从0到4循环 array[j-1][i]=array[j][i]+array[j-1][i]; if(array[j][i]> array[j][i+1])