给定一个数塔,其存储形式为如下所示的下三角矩阵。在此数塔中,从顶部出发,在每一节点可以选择向下走还是向右走,一直走到底层。请找出一条路径,使路径上的数值和最大。
输入样例(数塔):
9
12 15
10 6 8
2 18 9 5
19 7 10 4 16
输出样例(最大路径和):
59
import java.util.Scanner;
//测试数据
//9
//12 15
//10 6 8
//2 18 9 5
//19 7 10 4 16
public class HDU {
private int [][] data = new int[50][50];//存储原始数塔数据
private int [][] d = new int[50][50];//存储中间结果
protected void hdu(){
int i;//行
int j;//列
int b;//查找路径使用
int ii;//记录查找过程i值
int jj;//记录查找过程j值
System.out.println("请输入数塔数据");
Scanner scanner = new Scanner(System.in);
for(i = 1;i <= 5;i++){
for(j = 1;j <= i;j++){
data[i][j] = scanner.nextInt();
d[i][j] = data[i][j];
}
}
//计算最大值
for(i = 4;i >= 1;i--){
for(j = 1;j <= i;j++){
if(d[i+1][j] > d[i+1][j+1]){
d[i][j] = d[i][j]+d[i+1][j];
}else{
d[i][j] = d[i][j]+d[i+1][j+1];
}
}
}
System.out.println("最大值 "+d[1][1]);
//查找路径
System.out.print("路径为 "+data[1][1]+"->");
ii = 1;
jj = 1;
for(i = 1;i <= 5;i++){
b = d[ii][jj] - data[ii][jj];
for(j = 1;j <= i;j++){
if(b == d[i+1][j] && (i + 1) != 6){
System.out.print(data[i+1][j]+"->");
ii = i + 1;
jj = j;
}
}
}
// System.out.println("打印数据");
// for(i = 1;i <= 5;i++){
// for(j = 1;j <= i;j++){
// System.out.print(data[i][j]+" ");
// }
// System.out.println();
// }
}
public static void main(String[] args) {
new HDU().hdu();
}
}