动态规划算法之数塔有关问题
动态规划算法之数塔问题
一、问题描述
从数塔顶层出发,每个结点可以选择向左走或向右走,要求一直走到塔底,使得走过的路径上的数值和最大。
如上图所示的数塔,最大路径和为86,经过的路径从塔顶到塔底为13,8,26,15,24。
二、问题分析
动态规划函数为:
resultTower[i][j] = tower[i][j] + Math.max(tower[i + 1][j],tower[i + 1][j + 1]);
三、算法代码
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