题意:吸血鬼在一个洞穴遍地的地方,他拥有初始战斗力,如果战斗力大于了洞穴的c值他就能花时间逃出去,否则他的战斗力增加c,然后随机选择下一个要去的洞穴,问他出去所花时间的期望
思路:设dp[v] ,表示当能力值为v的时的期望。所以方程很容易写了,dp[v] = sum{ ti/n }(v直接逃出去) + sum { (1 + dp[v + c[i]])/n }(下一次逃出去) ;对于路i,如果v大于路i的限制,那么就能够用ti逃出去,概率为{1/n}否则只能进入下一天的尝试,所以需要用的时间为dp[v + c[i]] + 1 ,概率为{1/n};
代码:
#include<iostream> #include<cstdio> #include<string.h> #include<math.h> using namespace std; #define N 20005 double dp[N],t; int c[105],n,f; double dfs(int v) { int i,j; if(dp[v]>0) return dp[v]; for(i=0;i<n;i++) { if(v>c[i]) { dp[v]=dp[v]+int(t*c[i]*c[i])*1.0/n; } else { dp[v]=dp[v]+(1+dfs(v+c[i]))*1.0/n; } } return dp[v]; } int main() { int i,j; t=(1.0+sqrt(5.0))/2.0; while(~scanf("%d%d",&n,&f)) { memset(dp,0,sizeof(dp)); for(i=0;i<n;i++) scanf("%d",&c[i]); printf("%.3lf\n",dfs(f)); } return 0; }
时间: 2024-10-23 09:31:11