洛谷題單指南-動態規劃1-P1216 [USACO1.5] [IOI1994]數字三角形 Number Triangles

江城伍月發表於2024-04-18

原題連結:https://www.luogu.com.cn/problem/P1216

題意解讀:計算數字三角形最高點到最後一行路徑之和最大值,典型線性DP。

解題思路:

設a[i][j]表示數字三角形的值,

設dp[i][j]表示從最高點到第i行第j列路徑之和的最大值,

由於每一步可以走到左下方的點也可以到達右下方的點,

所以dp[i][j] = dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]) + a[i][j],

如果陣列下標從1開始,且預設值為0,則不用考慮陣列邊界和初始化問題。

100分程式碼:

#include <bits/stdc++.h>
using namespace std;

const int N = 1005;
int r, a[N][N], dp[N][N];
int ans;

int main()
{
    cin >> r;
    for(int i = 1; i <= r; i++)
        for(int j = 1; j <= i; j++)
            cin >> a[i][j];

    for(int i = 1; i <= r; i++)
        for(int j = 1; j <= i; j++)
            dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]) + a[i][j];

    for(int j = 1; j <= r; j++) ans = max(ans, dp[r][j]);
    cout << ans;
    return 0;
}

相關文章