ZOJ 3640 Help Me Escape 概率DP

做法:运用条件期望即可。当吸血鬼的能力为x时

dp[x]=1+p[i]*dp[x+c[i]] {x<=c[i]}

dp[x]=t[i]*p[i];{x>c[i]}

注意有个小陷阱就是一开始吸血鬼的能力就比所有洞洞所需要的能力的和大的多的情况。

#include<cstdio>
#include<cstring>
#include<cmath>
#define max(a,b) a>b?a:b
const int LMT=20003;
const double is=0.5*(1+sqrt(5));
double dp[LMT];
int have[102];
int main()
{
	int i,n,f,j,all;
	while(~scanf("%d%d",&n,&f))
	{
		memset(dp,0,sizeof(dp));
		all=-1;
		for(i=0;i<n;i++)
		{
			scanf("%d",&have[i]);
			all=max(all,have[i]);
		}
		all<<=1;
		for(i=max(all,f);i>=f;i--)
		{
			for(j=0;j<n;j++)
				if(i>have[j])dp[i]+=(int)(is*have[j]*have[j]);
				else dp[i]+=1+dp[i+have[j]];
					dp[i]/=n;
		}
		printf("%.3lf\n",dp[f]);
	}
	return 0;
}


 

你可能感兴趣的:(ZOJ 3640 Help Me Escape 概率DP)