标签:
有一个吸血鬼被困了,有n条路可以逃出去,每条路有一个难度c[],他初始的战斗力是f,对于第i条路,若f > c[i]他花t[i]天就能出去,否则,他就停留一天,同时战斗力增加c[i]然后再选一条路走出去,他走每条路的概率是相同的。问他逃出去的天数的期望。
设dp[i]表示在战斗力为i时逃出去的期望值,那么可推出状态方程
dp[i] = 1/n * t[j](c[j] > i),dp[i] = 1/n * (1+dp[ i+c[j] ] )( c[j] <= i)。
需要注意的是终态的确定。当f > Max时,这时的期望值为总时间的平均值便是终态了,但是i + c[j]有可能大于Max+1,所以终态应该是Max*2。初始化时就忘乘2了。
还有就是t[i]是整数。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<cstring>
using namespace std;
double dp[1000010];
int b[110];
double a=(1+sqrt(5))*0.5;
int main()
{
int n,f;
while(~scanf("%d %d",&n,&f))
{
int Max=0;
for(int i=1; i<=n; i++)
{
scanf("%d",&b[i]);
Max=max(Max,b[i]);
}
memset(dp,0,sizeof(dp));
for(int i=2*Max; i>=f; i--)
{
dp[i]=0;
for(int j=1; j<=n; j++)
{
if(i>b[j])dp[i]+=(int)(a*b[j]*b[j]);
else dp[i]+=(1+dp[i+b[j]]);
}
dp[i]/=n;
}
printf("%.3lf\n",dp[f]);
}
return 0;
}标签:
原文地址:http://blog.csdn.net/wweiainn/article/details/43962959