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;
}
浙公网安备 33010602011771号