一、问题描述
从数塔顶层出发,每个结点可以选择向左走或向右走,要求一直走到塔底,使得走过的路径上的数值和最大。
如上图所示的数塔,最大路径和为86,经过的路径从塔顶到塔底为13,8,26,15,24。
二、问题分析
动态规划函数为:
resultTower[i][j] = tower[i][j] + Math.max(tower[i + 1][j],tower[i + 1][j + 1]);
边界值resultTower[heigh - 1][j] = tower[heigh - 1][j];
三、算法代码
public int dataTower(int tower[][]){
int heigh = tower.length;//数塔高度
int len = tower[heigh - 1].length;//数塔底部宽度
int [][] resultTower = new int[heigh][len];//结果数塔,存放路径数值和
int [][] path = new int[heigh][len];//计算结果数塔生成路径
//初始化结果数塔
for(int i = 0; i < len; i++){
resultTower[heigh - 1][i] = tower[heigh - 1][i];
}
//开始计算结果数塔及路径
for(int i = heigh - 2; i >= 0; i--){
for(int j = 0; j <= i; j++){
if(resultTower[i + 1][j] > resultTower[i + 1][j + 1]){
resultTower[i][j] = tower[i][j] + resultTower[i + 1][j];
path[i][j] = j;
}else{
resultTower[i][j] = tower[i][j] + resultTower[i + 1][j + 1];
path[i][j] = j + 1;
}
}
}
//打印路径
System.out.println("最大数值和为" + resultTower[0][0] + "\n最大数值和路径:");
System.out.println("第0层数值:" + tower[0][0]);
int j = path[0][0];
for(int i = 1; i <= heigh - 1; i++){
System.out.println("第" + i + "层数值:" + tower[i][j]);
j = path[i][j];
}
System.out.println();
return resultTower[0][0];
}四、完整测试代码
public class Solution {
public static void main(String [] args){
int [][] tower = {{13},{11,8},{12,7,26},{6,14,15,8},{12,7,13,24,11}};
int result = dataTower(tower);
}
public static int dataTower(int tower[][]){
int heigh = tower.length;//数塔高度
int len = tower[heigh - 1].length;//数塔底部宽度
int [][] resultTower = new int[heigh][len];//结果数塔,存放路径数值和
int [][] path = new int[heigh][len];//计算结果数塔生成路径
//初始化结果数塔
for(int i = 0; i < len; i++){
resultTower[heigh - 1][i] = tower[heigh - 1][i];
}
//开始计算结果数塔及路径
for(int i = heigh - 2; i >= 0; i--){
for(int j = 0; j <= i; j++){
if(resultTower[i + 1][j] > resultTower[i + 1][j + 1]){
resultTower[i][j] = tower[i][j] + resultTower[i + 1][j];
path[i][j] = j;
}else{
resultTower[i][j] = tower[i][j] + resultTower[i + 1][j + 1];
path[i][j] = j + 1;
}
}
}
//打印路径
System.out.println("最大数值和为" + resultTower[0][0] + "\n最大数值和路径:");
System.out.println("第0层数值:" + tower[0][0]);
int j = path[0][0];
for(int i = 1; i <= heigh - 1; i++){
System.out.println("第" + i + "层数值:" + tower[i][j]);
j = path[i][j];
}
System.out.println();
return resultTower[0][0];
}
}
五、运行结果
最大数值和为86
最大数值和路径:
第0层数值:13
第1层数值:8
第2层数值:26
第3层数值:15
第4层数值:24

1005

被折叠的 条评论
为什么被折叠?



