题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1050
题意就不解释了
思路:
dp[i][j]表示i个红球j个蓝球的获胜概率。
初始化:dp[0][i] = 1 没有红球全是蓝球则获胜概率是1
转移:dp[i][j] = 我取得红球的概率*dp[i-1][j-1] + 我取得蓝球的概率*dp[i][j-2]
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string.h>
#include <string>
using namespace std;
double dp[1010][1010];
int R, B;
void init()
{
memset(dp, 0, sizeof(dp));
for (int i = 0;i <= 500;i++)
dp[0][i] = 1;
for (int i = 1;i <= 500;i++)
for (int j = 2;j <= 500;j++)
dp[i][j] = (double)i / (i + j) * dp[i - 1][j - 1] + (double)j / (i + j) * dp[i][j - 2];
}
int main()
{
init();
int T;
scanf("%d", &T);
for (int t = 1;t <= T;t++)
{
scanf("%d %d", &R, &B);
printf("Case %d: %.8lf\n", t, dp[R][B]);
}
return 0;
}