开始以为是记忆化搜索就能搞结果陷入死循环,然后用 矩阵保存 + 概率论 + 特殊情况 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;
}