hdu 6558 The Moon ###K ###K ###K //K

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6558

题意:每局游戏胜利后有q%的概率获得宝箱, 每把游戏的胜率为p%,如果游戏输了的话 q+=1.5% 如果游戏赢了的话 q+=2% q最大到100

思路:考虑概率dp 要求的是初始的q为2的期望 那么只能倒着往前转移才能求出来

考虑dp[i] 为概率为i的时候 期望的值是dp[i]  那么初始状态则是dp[100]=100/p  

然后从后往前转移  每次转移有三个状态  dp[i]=赢了游戏但没能获得宝箱+输了游戏  +1(回合数)   

因为赢了获得就宝箱游戏就结束了 没有后续情况所以不用管(相当于概率乘上了一个期望0,所以相当于没有)

考虑到有1.5小数, 把数放大到200 每一份为0.005

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define pb push_back
 5 const int maxn =3e5+10;
 6 const int mod=1e9+7;
 7 double dp[210];
 8 
 9 
10 int main()
11 {
12     ios::sync_with_stdio(false);
13     cin.tie(0);
14     int t;
15     cin>>t;
16     int cnt=0;
17     while(t--)
18     {
19         double p;
20         cin>>p;
21         cout<<"Case "<<++cnt<<": ";
22         memset(dp,0,sizeof(dp));
23         dp[200]=100/p;
24         p/=100;
25         for(int i=199;i>=4;i--)
26         {
27             dp[i]=1.0+p*(200-i)*0.005*dp[min(200,i+4)]+(1-p)*(dp[min(i+3,200)]);
28         }
29         cout<<fixed<<setprecision(10)<<dp[4]<<'\n';
30     }
31 
32 
33 
34 
35 
36 
37 
38 }
View Code

 

posted @ 2020-09-18 23:38  canwinfor  阅读(52)  评论(0)    收藏  举报