1 条题解
-
0
1. 确定可以使用DP
- 最优子结构
- 子问题重叠
2. DP思路
- 定义状态: 表示
3. 代码实现
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e3 + 5, INF = 0x3f3f3f3f, MOD = 1E9 + 7; int rd(int l, int r) { return (rand() << 15 | rand()) % (r - l + 1) + l; } /* dp[i,j] 表示剩下i个白和j个黑时A胜的概率 i=0 全是黑,A必败 dp[i][j]=0 j=0 全是白,A必胜 dp[i][j]=1 dp[0][0]=0 分四种情况: 1. A取到白 dp[i][j] += i / (i + j) 2. A取到黑,B取到白 dp[i][j] += 0; 3. A取到黑,B取到黑,白跑出来 dp[i][j] += j / (i + j) * (j - 1) / (i + j - 1) * i / (i + j - 2) * dp[i - 1][j - 2] 4. A取到黑,B取到黑,黑跑出来 dp[i][j] += j / (i + j) * (j - 1) / (i + j - 1) * (j - 2) / (i + j - 2) * dp[i][j - 3] */ int w, b; double dp[N][N]; signed main(int argc, char* argv[]) { while (cin >> w >> b) { memset(dp, 0x00, sizeof dp); for (int i = 1; i <= w; i++) dp[i][0] = 1; for (int i = 1; i <= w; i++) for (int j = 1; j <= b; j++) { dp[i][j] += 1.0 * i / (i + j); if (i >= 1 && 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 / (i + j) * (j - 1) / (i + j - 1) * (j - 2) / (i + j - 2) * dp[i][j - 3]; } cout << fixed << setprecision(10) << dp[w][b] << endl; } return 0; }
- 1
信息
- ID
- 1283
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者