一个高度为N的由正整数组成的三角形,从上走到下,求经过的数字和的最大值。
每次只能走到下一层相邻的数上,例如从第3层的6向下走,只能走到第4层的2或9上。
5
8 4
3 6 9
7 2 9 5
例子中的最优方案是:5 + 8 + 6 + 9 = 28
输入
第1行:N,N为数塔的高度。(2 <= N <= 500)
第2 - N + 1行:每行包括1层数塔的数字,第2行1个数,第3行2个数…第k+1行k个数。数与数之间用空格分隔(0 <= A[i] <= 10^5) 。
输出
输出最大值
输入样例
4
5
8 4
3 6 9
7 2 9 5
输出样例
28
思路
对于塔中的数字,有以下几种情况:
- 第一行第一个,最大值就是它本身。
- 每一行第一个,只可能从上一行的第一个到达。
- 每一行的最后一个,只可能从上一行的最后一个到达。
代码
import java.io.*;
public class nod1002 {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in), 1 << 16);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out), 1 << 16);
int N = Integer.parseInt(reader.readLine());
int[][] f = new int[N][];
String[] s;
// 先初始化第一行, 第一行只有一个元素
f[0] = new int[]{Integer.parseInt(reader.readLine())};
for(int i = 1; i < N; i++){
f[i] = new int[i + 1];
s = reader.readLine().split("\\s+");
// 处理每行第一个
f[i][0] = f[i - 1][0] + Integer.parseInt(s[0]);
// 处理第n行的第2个到第n - 1个
for(int j = 1; j < i; j++){
f[i][j] = Math.max(f[i - 1][j - 1], f[i - 1][j]) + Integer.parseInt(s[j]);
}
// 处理每行最后一个
f[i][i] = f[i - 1][i - 1] + Integer.parseInt(s[i]);
}
int max = Integer.MIN_VALUE;
for(int t : f[N - 1]){
if(t > max) max = t;
}
writer.write(max + "");
writer.flush();
}
}