码迷,mamicode.com
首页 > 其他好文 > 详细

poj 动态规划DP - 2018 Best Cow Fences

时间:2015-05-05 16:25:28      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:poj   动态规划   

这道题目我一开始的思路是用二维DP,结果TLE了。后来换了个思路,终于AC了。

不需要判断所有的情况,我们用dp[i]表示前i个牛圈中最大的牛数,而这个i首先必须>=限制的牛圈树f。用num[i]表示dp[i]中包含了多少牛圈。

我们可以知道,dp[i] = sum[i] - sum[i-f])/f  or  dp[i-1] + data[i], 前一个代表到i为止前f个牛圈的牛数,后一个代表前i-1个牛圈中最大牛数+第i个牛圈中的牛数。其实也就是到i为止前num[i-1]+1个牛圈的牛数。而判断取哪个的条件是判断(sum[i] - sum[i-f]))/f和dp[i-1] + data[i]/(num[i-1]+1)的大小。

#include<stdio.h>
#include<algorithm>
#define max(x,y)(x>y?x:y)
#define MAX 100002
double dp[MAX],data[MAX],num[MAX],sum[MAX];
int main(){
	int i,n,f;
	double maxval;
	scanf("%d %d",&n,&f);
	for(i=1;i<=n;i++) {
		scanf("%lf",&data[i]);
		sum[i] = data[i] +sum[i-1];
		num[i] = f;
	}
	dp[f] = sum[f];
	maxval  = dp[f]*1000/f;
	for(i=f+1;i<=n;i++){
		if ((sum[i] - sum[i-f])/f > (dp[i-1] + data[i])/ (num[i-1] +1)){
			dp[i] = sum[i] - sum[i-f];
			num[i] = f;
		}
		else{
		dp[i] = dp[i-1] + data[i];
		num[i] = num[i-1] +1;
		}
		maxval = max(maxval,dp[i]*1000/num[i]);
	}
	
	printf("%d\n",(int)(maxval));
}



poj 动态规划DP - 2018 Best Cow Fences

标签:poj   动态规划   

原文地址:http://blog.csdn.net/u010006643/article/details/45503897

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!