import java.util.Scanner;
/*输入格式:
5 //表示三角形的行数 接下来输入三角形
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在上面的数字三角形中寻找一条从顶部到底边的路径,
使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或 右下走。
只需要求出这个最大和即可,不必给出具体路径。 三角形的行数大于1小于等于100,数字为 0 - 99
要求输出最大和
*/public class POJ1163 {
static int row;
static int[][] D;
static int[][] memoryD;
static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
row = scanner.nextInt();
D = new int[row][row];
memoryD = new int[row][row];
for (int i = 0; i < row; i++) {
for (int j = 0; j <= i; j++) {
D[i][j] = scanner.nextInt();
}
}
row--;
int sum = maxSum(0, 0);
// System.out.println(sum);
int sum2 = maxSumDp(0, 0);
// System.out.println(sum2);
int sum3 = maxSum3(D);
System.err.println(sum3);
}
// 递推
private static int maxSum3(int[][] D) {
for (int i = D.length - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
D[i - 1][j] = max(D[i][j], D[i][j + 1]) + D[i - 1][j];
}
}
return D[0][0];
}
// 递归
private static int maxSum(int i, int j) {
return i == row ? D[i][j] : max(maxSum(i + 1, j), maxSum(i + 1, j + 1)) + D[i][j];
}
// 递归+DP
private static int maxSumDp(int i, int j) {
if (i == row)
return D[i][j];
if (memoryD[i][j] != 0)
return memoryD[i][j] + D[i][j];
else {
memoryD[i][j] = max(maxSum(i + 1, j), maxSum(i + 1, j + 1)) + D[i][j];
return memoryD[i][j];
}
}
private static int max(int maxSum, int maxSum2) {
return maxSum > maxSum2 ? maxSum : maxSum2;
}
}

本文介绍了一个经典的编程问题——寻找数字三角形中的最大路径和。通过递归、动态规划等方法实现了该问题的解决,并提供了具体的Java代码实现。适用于算法初学者及需要优化算法效率的开发者。
1217

被折叠的 条评论
为什么被折叠?



