一、实验目的及要求
实验目的
(1)掌握动态规划法的设计思想;
(2)掌握填表过程以及求解方法。
实验要求
(1)设计动态规划法的填表过程和求解方法;
(2)按照上面图例创建一组测试数据,设计一个算法生成整个表数据。
(3)按照上面图例和得到的表数据,设计一个算法推算出上图数塔问题的最优解。
二、实验环境
windows11,IDEA
三、实验内容
使用动态规划法解决数塔问题。
问题描述:从数塔的顶层出发,在每一个结点可以选择向左走或向右走,一直走到最底层,要求找出一条路径,使得路径上的数值和最大。
一个示例:
四、代码实现
public class TestDTGH {
public static void main(String[] args) {
DataTower();
}
static int [][] d ={{8},{12,15},{3,9,6},{8,10,5,12},{16,4,18,10,9}};
public static int n=d.length;//数塔层数
public static int maxAdd[][]=new int[n][n];//最大和
public static int path[][]=new int[n][n];//路径
static int DataTower(){//数塔问题
int i,j;
for(j=0;j<n;j++)
maxAdd[n-1][j]=d[n-1][j];
for(i=n-2;i>=0;i--) {
for(j=0;j<=i;j++) {
if(maxAdd[i+1][j]>maxAdd[i+1][j+1]) {
maxAdd[i][j]=d[i][j]+maxAdd[i+1][j];
path[i][j]=j;
}
else {
maxAdd[i][j]=d[i][j]+maxAdd[i+1][j+1];
path[i][j]=j+1;
}
}
}
System.out.print("路径为:"+d[0][0]);
j=path[0][0];
for(i=1;i<n;i++) {
System.out.print("-->"+d[i][j]);
j=path[i][j];
}
return maxAdd[0][0];
}
}
五、实验结果、