原題連結: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;
}