题意:
袋子里有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; }