题意:一场宴会,将会一直举办直到硬币投出第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 }