很经典的dp题,如果从上往下数,还需要判断边界存在,所以从下往上操作就很👌
为什么要判断边界?
本题的数据范围可以取负数,但初始化的数组为元素都为0,如果从上往下,最右边的数如果是负数就会取到三角形外面的0元素,然后WA掉。
#include <bits/stdc++.h>
#include <string>
#include <cmath>
#define ll long long
using namespace std;
const int N = 510;
int dp[N][N], w[N][N];
int main()
{
int n;
cin >> n;
//输入数字三角形
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= i;j ++)
{
cin >> w[i][j];
}
}
//为了方便,可以从下往上数
//那么先处理底部的数
for(int i = 1; i <= n; i++)
{
dp[n][i] = w[n][i];
}
for(int i = n - 1;i >= 0; i --)
{
for(int j = 1; j <= i; j ++)
{
//状态方程
dp[i][j] = max(dp[i+1][j]+w[i][j],dp[i+1][j+1]+w[i][j]);
}
}
cout << dp[1][1];
return 0;
}