标签:
题意:袋子里有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