动态规划算法之数塔问题

一、问题描述

从数塔顶层出发,每个结点可以选择向左走或向右走,要求一直走到塔底,使得走过的路径上的数值和最大。


如上图所示的数塔,最大路径和为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



你可能感兴趣的:(算法)