问题描述:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
上图给出了一个数字三角形。从三角形的顶部和底部有很多条不同的路径。
对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。
路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右边的那个数。
输入格式:
输入的第一行包含一个整数N(1<N<101),表示三角形的行数。
下面的N行给出数字三角形。数字三角形上的数都是0至100之间的整数。
输出格式:
输出一个整数,表示答案。
样例输入:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出:
30(路径是:7->3->8->7->5))***
代码:
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[][] dp = new int[n][n];
for (int i = 0; i < dp.length; i++) {
for (int j = 0; j <= i; j++) {
dp[i][j] = scanner.nextInt();
}
}
if (n == 1) {
System.out.println(dp[0][0]);
} else if (n == 2) {
System.out.println(dp[0][0] + Math.max(dp[1][0], dp[1][1]));
} else {
for (int i = n - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
dp[i - 1][j] += Math.max(dp[i][j], dp[i][j + 1]);
}
}
}
System.out.println(dp[0][0]);
}
程序执行结果: