题目
P2858 [USACO06FEB]Treats for the Cows G/S
思路
(dp)。
(dp[i][j]) 表示现在已经取了 (i) 个并且有 (j) 个是从左边取得的最优解。
状态转移方程:
(f[i][j] = max(f[i - 1][j] + a[n - i + j + 1] * i, f[i - 1][j - 1] + a[j] * i))
这应该不算是区间 (dp) 吧。。。
Code
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
#define MAXN 2001
int n, ans, a[MAXN], f[MAXN][MAXN];
int max(int a, int b) { return a > b ? a : b; }
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
f[1][1] = a[1], f[1][0] = a[n];
for (int i = 2; i <= n; ++i) {
for (int j = 0; j <= i; ++j) {
if (j == 0) f[i][j] = f[i - 1][j] + a[n - i + 1] * i;
else f[i][j] = max(f[i - 1][j] + a[n - i + j + 1] * i, f[i - 1][j - 1] + a[j] * i);
}
}
for (int i = 0; i <= n; ++i) {
ans = max(ans, f[n][i]);
}
printf("%d
", ans);
return 0;
}