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 }

浙公网安备 33010602011771号