CF540 D 概率 DP
石头剪刀布三种生物(?)
随机战斗,最后三方各自只有自己方存活下来的概率是多少。
局面的转移明显,注意任选两方决定战斗时有可能出现选了同个种类的,因此注意排除掉同种的组合,也就是条件概率什么的。
/** @Date : 2017-08-27 18:47:20 * @FileName: D.cpp * @Platform: Windows * @Author : Lweleth (SoungEarlf@gmail.com) * @Link : https://github.com/ * @Version : $Id$ */ #include <bits/stdc++.h> #define LL long long #define PII pair<int ,int> #define MP(x, y) make_pair((x),(y)) #define fi first #define se second #define PB(x) push_back((x)) #define MMG(x) memset((x), -1,sizeof(x)) #define MMF(x) memset((x),0,sizeof(x)) #define MMI(x) memset((x), INF, sizeof(x)) using namespace std; const int INF = 0x3f3f3f3f; const int N = 1e5+20; const double eps = 1e-8; double f[110][110][110]; int main() { int x, y, z; while(cin >> x >> y >> z) { MMF(f); f[x][y][z] = 1.00000000000; for(int i = x; i >= 0; i--) { for(int j = y; j >= 0; j--) { for(int k = z; k >= 0; k--) { if(!(i || j)|| !(i || k) || !(j || k)) continue; if(i > 0) f[i - 1][j][k] += f[i][j][k] * (1.000000 * i * k)/(1.000000*(double)(i*k + j*i + k*j)); if(j > 0) f[i][j - 1][k] += f[i][j][k] * (1.000000 * j * i)/(1.000000*(double)(i*k + j*i + k*j)); if(k > 0) f[i][j][k - 1] += f[i][j][k] * (1.000000 * k * j)/(1.000000*(double)(i*k + j*i + k*j)); //cout << f[i - 1][j][k] << "~" << f[i][j - 1][k] <<"~"<< f[i][j][k - 1] << endl; } } } double ans1, ans2, ans3; ans1 = ans2 = ans3 = 0; for(int i = 1; i <= x; i++) ans1 += f[i][0][0]; for(int i = 1; i <= y; i++) ans2 += f[0][i][0]; for(int i = 1; i <= z; i++) ans3 += f[0][0][i]; printf("%.9lf %.9lf %.9lf\n", ans1, ans2, ans3); } return 0; }