TYVJ 1088 treat 解题报告
简单DP,设f[i][j]是取i个数,左边取j个,转移方程:
f[i][j] = max(f[i - 1][j - 1] + i * num[j], f[i - 1][j] + i * num[n - (i - 1 - j)]);
2011年7月16日 08:55:21
添加:
昨晚删数那题,又看了下这题,就觉得这题不能用区间动态规划吗?仔细对比了一下,还真不能,这里的i无法用区间动态规划里的什么来表示,所以这里不能用区间动态规划。
代码如下:
#include <stdio.h> #include <stdlib.h> int num[2001]; int f[2001][2001]; #define max(a, b) ((a)>(b)?(a):(b)) int ans; int main(int argc, char **argv) { int i, j; int n; scanf("%d", &n); for(i = 1; i <= n; i++){ scanf("%d", &num[i]); } for(i = 1; i <= n; i++){ for(j = 0; j <= i; j++){ f[i][j] = max(f[i - 1][j - 1] + i * num[j], f[i - 1][j] + i * num[n - (i - 1 - j)]); } } for(i = 0; i <= n; i++){ if(ans < f[n][i]){ ans = f[n][i]; } } printf("%d\n", ans); return 0; }