数塔问题

本文探讨了如何解决数塔问题,即在给定的下三角矩阵中找到一条路径,使得路径上的数值之和最大。通过从顶部开始,每次选择向下或向右移动,目标是最大化路径总和。例如,给定的数塔中,最大路径和为59。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个数塔,其存储形式为如下所示的下三角矩阵。在此数塔中,从顶部出发,在每一节点可以选择向下走还是向右走,一直走到底层。请找出一条路径,使路径上的数值和最大。

输入样例(数塔):

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();
	}
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值