题目
求从第一层走到最低一层经过权值最大多少
分析
状态转移:dp[i][j] += max(dp[i-1][j], dp[i-1][j-1]
可以用一个pre数组存一下dp[i-1][j-1],空间优化。
#include <bits/stdc++.h>
#pragma GCC diagnostic error "-std=c++11"
#define d(x) cout << (x) << endl
#define INF 0x3f3f3f3f
#define eps 1e-8
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 500 + 10;
int n, num, ans = 0, tmp;
int dp[N];
int pre[N];
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++){
for(int j = 1; j <= i; j++){
scanf("%d", &num);
pre[j] = dp[j];
dp[j] = num + max(pre[j-1], dp[j]);
ans = max(ans, dp[j]);
}
}
printf("%d\n", ans);
return 0;
}