1 条题解

  • 0
    @ 2024-6-13 23:52:37

    1. 确定可以使用DP

    1. 最优子结构
    2. 子问题重叠

    2. DP思路

    1. 定义状态:dpi,jdp_{i,j} 表示

    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
    上传者