嗯,这个蒟蒻小萌新做这么一道水 dp,WA 了成千上万次,论我心态崩不崩(已经没有心态了)。。。
首先,我一开始用的是限时做,所以代码有点乱,请谅解。
前几次提交的时候,是顺推,但是由于没有设好边界条件,所以WA得好惨啊/kk
后来实在是调到不行,直接改倒推,一交就对了,,,
动态转移方程:
考虑每一个点的情况,是取 (i+1,j) 和 (i+1,j+1) 坐标上的值再加上 (i,j) 的值,可以推出动态转移方程:
f[i][j] = max (f[i+1][j], f[i+1][j+1]) + a[i][j];
code:
#include <bits/stdc++.h>
using namespace std;
signed main() {
int a[505][505], f[505][505], n, ans = -0x7ffffff;//变量初始化
memset (a, 0, sizeof (a));
memset (f, 0, sizeof (f));//数组初始化
cin >> n;
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--)
for (int j=1; j<=i; j++)
f[i][j] = max (f[i+1][j], f[i+1][j+1]) + a[i][j];//珂爱的动态转移方程
cout << f[1][1];//输出
return 0;
}