现在的位置: 首页 > 综合 > 正文

hdu 1204 Gardon的题果然不是人做的

2014年10月23日 ⁄ 综合 ⁄ 共 1202字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.