AcWing 898. 数字三角形 (线性DP,思维线性,递推)
原题链接
简单
作者:
迷弟
,
2024-11-13 14:03:00
,
所有人可见
,
阅读 5
#include <iostream>
using namespace std;
const int N = 505;
int a[N][N],dp[N][N];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i ++ ){
for (int j = 0; j <= n+1; j ++ ){
a[i][j]= -0x3f3f3f3f3f3f;
}
}
for (int i = 1; i <= n; i ++ ){
for (int j = 1; j <= i; j++ ){
cin >> a[i][j];
}
}
/*
for (int i = n; i >=1; i -- ){ //从底 n 行往上推
for (int j = 1; j <= i; j ++ ){
a[i][j]+=max(a[i+1][j+1],a[i+1][j]);
}
}
cout << a[1][1] << endl;
*/
// 从上往下走
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++) {
cin>>a[i][j];
a[i][j]+=max(a[i-1][j],a[i-1][j-1]);
}
int ans = -0x3f3f3f3f3f3f;
for (int i = 1; i <= n; i ++ ){
//cout << a[n][i] << endl;
ans = max(ans,a[n][i]); //由于从上往下,最后一层要判断走哪个元素最大
}
cout << ans << endl;
// dp[i][j] 定义为第i行,走到第j列的最大路径和。
// dp[i][j] 可以从左边下来,也可以从右边下来。dp[i][j]=max(dp[i-1][j-1]+a[i-1][j-1],dp[i-1][j]+a[i-1][j]);
return 0;
}