如图所示,展出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路径,使该路径所经过的数字的总和最大。
每一步可沿左斜线向下或右斜线向下走;
1< 三角形行数< 25;
三角形中的数字为整数< 1000;
输入第一行为N,表示有N行后面N行表示三角形每条路的路径权
输出路径所经过的数字的总和最大的答案
样例输入
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
样例输出
30
public class RectangleNumbers {
public static void main(String[] args) throws FileNotFoundException {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int[][] dp = new int[num][num];
for (int i = 0; i < num; i++) {
for (int j = 0; j <= i; j++) {
dp[i][j] = sc.nextInt();
}
}
sc.close();
solve(dp);
System.out.println(dp[0][0]);
}
public static void solve(int[][] dp) {
for (int i = dp.length-2; i >= 0; i--) {
for (int j = 0; j <= i; j++) {
dp[i][j] += Math.max(dp[i+1][j], dp[i+1][j+1]);//核心代码
}
}
}
}
类似的,为了得到计算最小边权和的算法实现,我们可以将核心代码改写为:
dp[i][j] += Math.min(dp[i+1][j], dp[i+1][j+1]);
样例输入
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
样例输出
17