codeforces 148D 概率dp 记忆化搜索

题意:

     袋子里有w只白鼠和b只黑鼠

     龙和公主轮流从袋子里抓老鼠。谁先抓到白色老师谁就赢。
     公主每次抓一只老鼠,龙每次抓完一只老鼠之后会有一只老鼠跑出来。
     每次抓老鼠和跑出来的老鼠都是随机的。
     如果两个人都没有抓到白色老鼠则龙赢。公主先抓。

     问公主赢的概率。


解析:

    这题选用记忆化搜索还是比较容易的,不容易错,很快能出来,用for循环做的话有点 求期望的感觉。

    思路在代码中注明

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
double dp[1001][1001];
bool vis[1001][1001];
int w, b;
double dfs(int w, int b) {
    if (w <= 0) return 0; //没有白就输
    if (b <= 0) return 1; //有白球没有黑就赢
    if (vis[w][b]) return dp[w][b];
    vis[w][b] = 1;
    double &ret = dp[w][b];
    ret = w * 1.0 / (w + b);   //摸到白
    if (b >= 2) {               //公主和恐龙都摸到黑
        double tp = b * 1.0 / (w + b);  
        b--;
        tp *= b * 1.0 / (w + b);
        b--;
            //    白的跑了                               黑的跑了
        ret += tp* (w * 1.0 / (w + b) * dfs(w - 1, b) + b * 1.0 / (w + b) * dfs(w, b - 1));
    }
    return ret;
}
int main() {
    scanf("%d%d", &w, &b);
    printf("%.9f\n", dfs(w, b));
    return 0;
}


你可能感兴趣的:(codeforces 148D 概率dp 记忆化搜索)