题解 CF148D 【Bag of mice】

· · 题解

Description

翻译君写的清清楚楚明明白白

Solution

Code 1

//DP
#include<bits/stdc++.h>
using namespace std;

inline int read()
{
    int N=0,C=0;char tf=getchar();
    for(;!isdigit(tf);tf=getchar())C|=tf=='-';
    for(;isdigit(tf);tf=getchar())N=(N<<1)+(N<<3)+(tf^48);
    return C?-N:N;
}

const int N=1010;
int w,b;
double f[N][N];

int main()
{
    w=read(),b=read();

    for(int i=1;i<=w;++i)
        f[i][0]=1.0,f[i][1]=1.0*i/(i+1);//全白必胜,一黑首回合必须抽到白鼠

    if(!b||b==1)return printf("%.9lf\n",f[w][b]),0;
    for(int i=1;i<=w;++i)
        for(int j=2;j<=b;++j)
        {
            f[i][j]=1.0*i/(i+j);
            f[i][j]+=1.0*j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)*f[i-1][j-2];//跑白
            if(j^2)f[i][j]+=1.0*j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)*f[i][j-3];//跑黑 
        }
    printf("%.9lf\n",f[w][b]);

    return 0;
}

Code 2

//记忆化搜索
#include<bits/stdc++.h>
using namespace std;

inline int read()
{
    int N=0,C=0;char tf=getchar();
    for(;!isdigit(tf);tf=getchar())C|=tf=='-';
    for(;isdigit(tf);tf=getchar())N=(N<<1)+(N<<3)+(tf^48);
    return C?-N:N;
}

const int N=1010;
int w,b;
double f[N][N];

double dfs(int i,int j)
{
    if(f[i][j])return f[i][j];
    if(!i)return 0;//全黑必败 
    if(!j)return f[i][j]=1.0;//全白必胜 
    if(j==1)return f[i][j]=1.0*i/(i+1);//一黑首回合必须抽到白鼠 
    f[i][j]=1.0*i/(i+j);
    f[i][j]+=1.0*j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)*dfs(i-1,j-2);//跑白
    if(j>2)f[i][j]+=1.0*j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)*dfs(i,j-3);//跑黑 
    return f[i][j];
}

int main()
{
    w=read(),b=read();
    printf("%.9lf\n",dfs(w,b));

    return 0;
}