数字三角形(dp)

题目描述

给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。

输入

第一行包含整数n,表示数字三角形的层数。

接下来n行,每行包含若干整数,其中第 i 行表示数字三角形第 i 层包含的整数。

输出

输出一个整数,表示最大的路径数字和。

样例输入 Copy

5
7
3 8
8 1 0 
2 7 4 4
4 5 2 6 5

样例输出 Copy

30

提示

1 ≤ n ≤ 500
1 ≤ n ≤ 500
−10000 ≤ 三角形中的整数 ≤ 10000

答案样例

#include<iostream>

using namespace std;

const int N = 510, inf = 1e9;
int arr[N][N];
int f[N][N];

int main()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= i; j++)
        {
            cin >> arr[i][j];
        }
    }

    for (int i = 0; i <= n; i++)
    {
        for (int j = 0; j <= i + 1; j++) f[i][j] = -inf;
    }

    f[1][1] = arr[1][1];

    for (int i = 2; i <= n; i++)
    {
        for (int j = 1; j <= i; j++)
        {
            f[i][j] = max(f[i - 1][j - 1] + arr[i][j], f[i - 1][j] + arr[i][j]);
        }
    }

    int sum = 0;
    for (int j = 0; j <= n; j++) sum = max(sum, f[n][j]);

    cout << sum;

    return 0;
}

 

posted @ 2022-02-23 17:43  ora12321  阅读(24)  评论(0)    收藏  举报