这么多天对DP还是研究的不够透彻,DP入门第一题。
初始条件为dp[0][0]=tip的值,其余dp[i][j]取决于dp[i-1][j]和dp[i-1][j-1]和本身dp[i][j]的值。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 350;
int bowl[MAXN+5][MAXN+5];
int dp[MAXN+5][MAXN+5];
int main()
{
int n;
scanf("%d", &n);
memset(bowl, -1, sizeof(dp));
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
scanf("%d", &bowl[i][j]);
}
}
dp[0][0] = bowl[0][0];
for (int i = 1; i < n; i++) {
for (int j = 0; j <= i; j++) {
if (j - 1 < 0) {
dp[i][j] = max(dp[i-1][j]+bowl[i][j], dp[i][j]);
}
else
dp[i][j] = max(max(dp[i-1][j], dp[i-1][j-1])+bowl[i][j], dp[i][j]);
}
}
int ans = 0;
for (int i = 0; i < n; i++) {
ans = max(ans, dp[n-1][i]);
}
printf("%d\n", ans);
return 0;
}