动态规划复习-HDU2084
水题一道,但是论坛中有人说从上往下dp,一定是wa,我两个方向都试过了,全部ac。
自底向上dp:
#include
int c, n;
int dp[100][100];
int max (int a, int b) {
if (a > b)
return a;
return b;
}
int main() {
scanf("%d", &c);
while (c--) {
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= i; ++j)
scanf("%d", &dp[i][j]);
for (int i = n - 1; i > 0; --i)
for (int j = 1; j <= i; ++j)
dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + dp[i][j];
printf("%d\n", dp[1][1]);
}
return 0;
}
自顶向下dp:
#include
#include
int c, n;
int dp[100][100];
int max (int a, int b) {
if (a > b)
return a;
return b;
}
int main() {
scanf("%d", &c);
while (c--) {
scanf("%d", &n);
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= i; ++j)
scanf("%d", &dp[i][j]);
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= i; ++j)
dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][j]) + dp[i][j];
int m = 0;
for (int i = 1; i <= n; ++i)
if (dp[n][i] > m) m = dp[n][i];
printf("%d\n", m);
}
return 0;
}
注意不要和“自顶向下分析,自底向上求解”混淆了。
浙公网安备 33010602011771号