POJ 3682

题意:一场宴会,将会一直举办直到硬币投出第k次正面向上,正面向上的概率为p。另外,第i天的宴会将会花费2i-1的钱,问最后宴会结束期望以及花钱期望。

题解:递推求期望,设dp1[i]为已经抛出i次正面时,结束时间的期望,dp2[i]为已经抛出i次正面时,结束金钱的期望。

dp1[i]=(dp1[i]+1)*(1-p)+dp1[i+1]*p   ==>  dp1[i]=dp[i+1]+1/p

假设宴会会矩形m天,第一天花费1,第二天花费3.......等价于第m天花费1,第m-1天花费3......

所以,有了dp1,dp2[i]=(dp2[i+1]+(dp1[i+1]+1)*2-1)*p+(dp2[i]+(dp1[i]+1)*2-1)*(1-p)  ==>  dp2[i]=dp2[i+1]+2*dp1[i+1]+1+(1-p)/p*(2*dp1[i]+1)

View Code
 1 #include<cstdio>

 2 #include<cstring>

 3 #include<algorithm>

 4 using namespace std;

 5 double dp1[1005],dp2[1005];

 6 int main()

 7 {

 8     int n;

 9     double p;

10     while(scanf("%d",&n),n)

11     {

12         scanf("%lf",&p);

13         dp1[n]=0;

14         dp2[n]=0;

15         for(int i=n-1;i>=0;i--)

16         {

17             dp1[i]=dp1[i+1]+1.0/p;

18             dp2[i]=dp2[i+1]+2*dp1[i+1]+1+(1-p)/p*(2*dp1[i]+1);

19         }

20         printf("%.3lf %.3lf\n",dp1[0],dp2[0]);

21     }

22     return 0;

23 }

你可能感兴趣的:(poj)