Codeforces Round #105 (Div. 2) D题

概率dp,dp[i][j]为i个白兔和j个黑兔的时候,公主胜利的概率,公主第一次拿就拿到了白兔的概率为i/(i+j)
公主第一次拿到了黑兔,龙拿到了黑兔,跳出了一个黑兔,就到了dp[i][j-3],概率为:1.0 * j / (j+i) (j-1)/(i+j-1)(j-2)/(i+j-2)。
公主第一次拿到了黑兔,龙拿到了黑兔,跳出了一个白兔,就到了dp[i-1][j-2],概率为:1.0 * j / (i+j) (j-1)/(i+j-1)i/(i+j-2)。

double dp[2000][2000];

int main() {
    int a,b;
    scanf("%d%d",&a,&b);
    for(int i = 1; i <= a; i++) dp[i][0] = 1;
    for(int i = 1; i <= a; i++) {
        for(int j = 1; j <= b; j++) {
            dp[i][j] = 1.0 * i/(i+j);
            if(j >= 2) dp[i][j] += 1.0 * j / (i+j) *(j-1)/(i+j-1)*i/(i+j-2)*dp[i-1][j-2];
            if(j >= 3) dp[i][j] += 1.0 * j / (j+i) *(j-1)/(i+j-1)*(j-2)/(i+j-2)*dp[i][j-3];
        }
    }
    printf("%.9lf",dp[a][b]);
    return 0;
}

你可能感兴趣的:(Codeforces Round #105 (Div. 2) D题)