吉林区域赛 D - The Moon
https://vjudge.net/contest/386991#problem/D
题意:给出4个操作步骤,让我们模拟操作,问拿到数据箱子的期望轮数是多少
思路:
(思路:首先肯定是q,即掉落率为100时结束。dp[i][j]表示胜率为i,掉落率为q时的期望。记忆化搜索时,当q>=1000时(因为有1.5,所以乘以1000),直接返回p/100.0;(期望可以理解成概率的倒数)否则,这时的期望便为
1.0+(p/100.0)*(1.0-q/1000.0)*dfs(p,q+20)+(1.0-p/100.0)*dfs(p,q+15)。即本场+获胜为掉落+失败。)
1 #include <bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 double dp[110][1010]; 5 double dfs(int p,int q) 6 { 7 //cout<<p<<" "<<q<<endl; 8 if(q>=1000) return 100.0/p;//期望其实是概率的倒数,因为100%掉落,只需要考虑获胜要进行的场次 9 if(dp[p][q]!=-1) return dp[p][q];//记忆化搜索 10 dp[p][q]=1.0+(p/100.0)*(1.0-q/1000.0)*dfs(p,q+20)+(100.0-p)/100.0*dfs(p,q+15); 11 //1.0这一场次+获胜但没掉落+失败 12 return dp[p][q]; 13 } 14 int main(void) 15 { 16 for(int i=1;i<=100;i++) 17 for(int j=1;j<=1000;j++) 18 dp[i][j]=-1; 19 int cas=0,t; 20 scanf("%d",&t); 21 while(t--) 22 { 23 int p; 24 scanf("%d",&p); 25 printf("Case %d: %.10f\n",++cas,dfs(p,20)); 26 } 27 return 0; 28 }