[实验题目3]
使用动态规划法解决数塔问题。
问题描述:从数塔的顶层出发,在每一个结点可以选择向左走或向右走,一直走到最底层,要求找出一条路径,使得路径上的数值和最大。
一个示例:
核心思想:
二位数组存储;
从最低层向上遍历每次记录最大值,直到顶层;
逆向求出所走路径,即从顶向底。
实验代码:
//数塔问题
public class Main3 {
public static void main(String[] args) {
int[][] arr = { {8, 0, 0, 0, 0},
{12, 15, 0, 0, 0},
{3, 9, 6, 0, 0},
{8, 10, 5, 12, 0},
{16, 4, 18, 10, 9},
};
int res = getMaxSum(arr);
System.out.println("最大路径值为:"+res);
}
public static int getMaxSum(int [][] arr){
int n = arr.length;
int[][] maxSum=new int[n][n];
//初始化最后一行
for (int i = 0; i <n ; i++) {
maxSum[n-1][i] = arr[n-1][i];
}
for (int i = n-2; i >=0; i--) {
for (int j = 0; j <n-1 ; j++) {
maxSum[i][j] = Math.max(maxSum[i+1][j]+arr[i][j],maxSum[i+1][j+1]+arr[i][j]);
}
}
//保存路径
List<Integer> path = new ArrayList<Integer>();
int max = maxSum[0][0];
for (int i = 0; i<n-1; i++) {
for (int j = 0; j <=i ; j++) {
if ((max-arr[i][j])==maxSum[i+1][j+1]){
max = maxSum[i+1][j+1];
path.add(arr[i][j]);
break;
}else if ((max-arr[i][j])==maxSum[i+1][j]){
max = maxSum[i+1][j];
path.add(arr[i][j]);
break;
}
}
}
//添加最后一层
for (int i = 0; i <n ; i++) {
if (arr[n-1][i]==max){
path.add(arr[n-1][i]);
}
}
//打印路径
for (int i = 0; i < path.size(); i++) {
System.out.print(path.get(i)+"-->");
}
System.out.println("");
return maxSum[0][0];
}
}
输出结果: