您的位置:首页 > 其它

CodeForces-148D Bag of mice 概率dp

2018-09-04 21:55 423 查看

题目链接:https://cn.vjudge.net/problem/CodeForces-148D

题意

有一个公主和龙的故事,公主和龙玩游戏。
公主每次从装满黑白老鼠的袋子里拿一个老鼠;而龙每次拿一个老鼠,放跑一只。
先拿到白色老鼠的人(龙?)赢。
给出白色老鼠,黑色老鼠的个数,且公主先拿。
问公主获胜的概率。

思路

概率dp,设dp·[i][j]为剩下i只白鼠j只黑鼠的公主获胜概率。
则边界dp[0][0]=0
转移方程如下,就不太写思路了 : P
\[ \begin{align*} dp(i,j) &= \frac{i}{i+j}\frac{i-1}{i+j-1}\frac{i-2}{i+j-2}dp(i-3, j)\\ &+\frac{i}{i+j}\frac{i-1}{i+j-1}\frac{j}{i+j-2}dp(i-2, j-1) \\ &+\frac{j}{i+j} \end{align*} \]

提交过程

AC 1A呢,题简单了

代码

#include <cstdio>
#include <cstring>
const int maxn=1e3+20;
double data[maxn][maxn];
bool vis[maxn][maxn];
int nb, nw;
double dp(int i, int j){
if (i==0 && j==0) return 0;
if (i<0 || j<0) return 0;
if (vis[i][j]) return data[i][j];

vis[i][j]=true;
double &d=data[i][j];
if (i+j>=3){
d=(i/(double)(i+j))*((i-1)/(double)(i+j-1))*((i-2)/(double)(i+j-2))*dp(i-3, j);
d+=(i/(double)(i+j))*((i-1)/(double)(i+j-1))*(j/(double)(i+j-2))*dp(i-2, j-1);
d+=j/(long double)(i+j);
}else if (i+j==2){
if (i==2) d=0;
if (j==2) d=1;
if (i==1) d=0.5;
}else if (i+j==1){
if (i==1) d=0;
if (j==1) d=1;
}
return d;
}

int main(void){
while (scanf("%d%d", &nw, &nb)==2){
printf("%.9f\n", dp(nb, nw));
}

return 0;
}
Time Memory Length Lang Submitted
92ms 9004kB 819 GNU G++ 5.1.0 2018-08-31 15:45:32
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: