标签:
题意:袋子里有w只白鼠和b只黑鼠。龙和公主轮流从袋子里抓老鼠。谁先抓到白色老师谁就赢。公主每次抓一只老鼠,龙每次抓完一只老鼠之后会有一只老鼠跑出来。每次抓老鼠和跑出来的老鼠都是随机的。如果两个人都没有抓到白色老鼠则龙赢。公主先抓。问公主赢的概率。
做了这么多概率dp的题目了,本来接的差不多了,结果一做还是不会。。。。。。
下面是看了别人的思路
win[i][j] = i * 1.0 / (i + j); //i只白老鼠j只黑老鼠时公主选白老鼠
win[i][j] += lost[i][j-1] * j * 1.0 / (i + j); //i只白老鼠j只黑老鼠时公主选黑老鼠,但公主选完黑老鼠后龙还是输了
lost[i][j] = j * 1.0 / (i + j) * win[i-1][j-1] * (i * 1.0 / (i + j - 1)); //i只白老鼠j只黑老鼠时龙选黑老鼠,选完后跳出去只白老鼠
lost[i][j] += j * 1.0 / (i + j) * win[i][j-2] * ((j - 1) * 1.0 / (i + j - 1)); //i只白老鼠j只黑老鼠时龙选黑老鼠,选完后跳出去只黑老鼠
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
double win[1100][1100],lost[1100][1100];
int main()
{
int w,b;
while(~scanf("%d %d",&w,&b))
{
memset(win,0,sizeof(win));
memset(lost,0,sizeof(lost));
for (int i = 1; i <= w; ++i)
win[i][0] = 1.0;
for(int i=1; i<=w; i++)
for(int j=1; j<=b; j++)
{
win[i][j] = i * 1.0 / (i + j) + lost[i][j-1] * j * 1.0 / (i + j);//这个是他本次赢或者本次不赢但是下次龙输到最后一定赢
lost[i][j]=j*1.0/(i+j)*win[i-1][j-1]*i*1.0/(i+j-1);//龙本次输了肯定是选了黑色的,所以要用下次公主赢得乘上对应跑白色或者黑色的概率
lost[i][j]+=j*1.0/(i+j)*win[i][j-2]*(j-1)*1.0/(i+j-1);
}
printf("%.9lf\n",win[w][b]);
}
return 0;
}
Problem A CodeForces 148D 概率dp
标签:
原文地址:http://blog.csdn.net/wweiainn/article/details/43938901