您好,欢迎访问三七文档
动态规划算法的应用一、实验目的1.掌握动态规划算法的基本思想,包括最优子结构性质和基于表格的最优值计算方法。2.熟练掌握分阶段的和递推的最优子结构分析方法。3.学会利用动态规划算法解决实际问题。二、实验内容题目一:数塔问题给定一个数塔,其存储形式为如下所示的下三角矩阵。在此数塔中,从顶部出发,在每一节点可以选择向下走还是向右走,一直走到底层。请找出一条路径,使路径上的数值和最大。输入样例(数塔):91510682189519710416输出样例(最大路径和):59三、实验步骤(1)需求分析通过动态规划法解决数塔问题。从顶部出发,在每一节点可以选择向下或者向右走,一直走到底层,以找出一条数值最大的路径。(2)概要设计本次实验程序主要用到二维数组,以及通过动态规划法进行比较每个数的大小。主要运用两个for循环语句实现动态规划。(3)详细设计第一步,输入给定的二维数组并打印出相应的数组:intarray[5][5]={{9},/**/{12,15},/**/{10,6,8},/**/{2,18,9,5},/**/{19,7,10,4,6}};inti,j;for(i=0;i5;i++){for(j=0;j5;j++)coutarray[i][j]'';coutendl;}第二步,使用动态规划法思想对数组元素最比较,并保留比较出来的路径。for(j=4;j0;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];elsearray[j-1][i]=array[j][i+1]+array[j-1][i];}}第三步,输出最大路径的值。coutarray[0][0]endl;声明一个二维数组并初始化预定义(4)调试分析本实验刚开始时我从最后一行开始,每一个数都比较,然后找出最大的再与前一行相加,因此算出来的路径之始终小于59,经过反复验证,我两个数的比较,并修改循环方式,最后得出了正确答案。(5)测试结果:输出结果array[0][0]if(array[j][i]array[j][i+1])array[j-1][i]=array[j][i]+array[j-1][i];array[j-1][i]=array[j][i+1]+array[j-1][i];if(array[j][i]array[j][i+1])j从4到0循环i从0到4循环YN四、实验总结通过本次实验,是我对动态规划这一方法有了更深的了解,和更加熟练的应用。虽然过去编写程序是也经常用到动态规划这一方法,但是当时根本就不了解动态规划是什么,现在知道使用动态规划能够降低工程量并且更重要的是降低运行次数节省运行时间。五、附录:程序清单#includeiostream#includecmathusingnamespacestd;intmain(){intarray[5][5]={{9},/**/{12,15},/**/{10,6,8},/**/{2,18,9,5},/**/{19,7,10,4,6}};inti,j;for(i=0;i5;i++){for(j=0;j5;j++)coutarray[i][j]'';coutendl;}for(j=4;j0;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];elsearray[j-1][i]=array[j][i+1]+array[j-1][i];}}coutarray[0][0]endl;return0;}
本文标题:动态规划算法的应用
链接地址:https://www.777doc.com/doc-6060397 .html