ZOJ 3640 Help Me Escape 概率DP

来源:互联网 发布:ssh毕业设计2016源码 编辑:程序博客网 时间:2024/05/22 08:11

做法:运用条件期望即可。当吸血鬼的能力为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:bconst 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;}