开始以为是记忆化搜索就能搞结果陷入死循环,然后用 矩阵保存 + 概率论 + 特殊情况 ac了!!
无限if else if else 。。。。。。
#include<iostream> #include<vector> #include<string> #include<algorithm> #include<cmath> #include<iomanip> using namespace std; const int maxn=111; double dp[maxn][2]; double ans[maxn]; bool vis[maxn]; int n,m,sum; double pa,pb,win,lose,pin; double a,b; void init() { memset(vis,false,sizeof(vis)); sum=n+m; win=pa*(1.0-pb); lose=(1.0-pa)*pb; pin=1.0-win-lose; dp[0][0]=1.0; dp[0][1]=0.0; dp[sum][0]=0.0; dp[sum][1]=0.0; a=win/(1.0-pin); b=lose/(1.0-pin); return ; } void dpstart() { for(int i=1;i<sum;i++) { dp[i][0] = ( a*dp[i-1][0] ) / ( 1.0 - a*dp[i-1][1] ); dp[i][1] = b / ( 1.0 - a*dp[i-1][1] ); } ans[sum]=0.0; for(int i=sum-1;i>=1;i--) { ans[i]=dp[i][0]+ans[i+1]*dp[i][1]; } return ; } int main() { cout.setf(ios::fixed); while(cin>>n>>m>>pa>>pb) { if(n==0) { cout<<"0.00"<<endl; } else if(m==0) { cout<<"1.00"<<endl; } else if( pa==1.0 && pb == 1.0) { if(n==0) { cout<<"0.00"<<endl; } else if(m==0) { cout<<"1.00"<<endl; } else { cout<<"0.00"<<endl; } } else if( pa==0.0 && pb==0.0) { if(m!=0) { cout<<"0.00"<<endl; } else { cout<<"1.00"<<endl; } } else if( pa==1.0) { if(n!=0) { cout<<"1.00"<<endl; } else { cout<<"0.00"<<endl; } } else if(pb==1.0) { if(m!=0) { cout<<"0.00"<<endl; } else { cout<<"1.00"<<endl; } } else { init(); dpstart(); cout<<setprecision(2)<<ans[m]<<endl; } } return 0; }