【动态规划】【水】nod1002 数塔取数问题

一个高度为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();
    }
}

猜你喜欢

转载自blog.csdn.net/a617976080/article/details/88760549