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;
}

posted @ 2011-07-12 20:40  zqynux  阅读(191)  评论(0编辑  收藏  举报