数字金字塔(java)

【题目描述】

观察下面的数字金字塔。写一个程序查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以从当前点走到左下方的点也可以到达右下方的点。
在这里插入图片描述
在上面的样例中,从13到8到26到15到24的路径产生了最大的和86。

【输入】

第一个行包含R(1≤ R≤1000),表示行的数目。
后面每行为这个数字金字塔特定行包含的整数。
所有的被供应的整数是非负的且不大于100。

【输出】

单独的一行,包含那个可能得到的最大的和。

【输入样例】

5
13
11 8
12 7 26
6 14 15 8
12 7 13 24 11

【输出样例】

86

思路

用二维数组存储数据,从下往上循环下面两个结点的最大值加到上面那个结点即可
a[i][j] 加上 a[i+1][j] 和 a[i+1][j+1]其中大一点的那个

(ps:最开始思路是从上往下的…这样不光在循环的时候要考虑数字是三角形边上还是里面(边上不需要考虑最大值直接加上即可),循环完之后还要再循环一次找到最大值…相当麻烦……)

代码

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int[][] num = new int[1001][1001];
		int[][] sum = new int[1001][1001];
		int n = in.nextInt();
		for(int i=1;i<=n;i++)
			for(int j=1;j<=i;j++)
				num[i][j] = in.nextInt();
		for(int i=n-1;i>=1;i--)
			for(int j=1;j<=i;j++)
				num[i][j] += num[i+1][j]>num[i+1][j+1]?num[i+1][j]:num[i+1][j+1];
				// 直接原数据数组上更改
		System.out.println(num[1][1]);
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值