【蓝桥每日一题]-动态规划 (保姆级教程 篇9)#抓老鼠

目录

题目:抓老鼠

  思路: 


  

题目:抓老鼠

题意:一共有w只白鼠b只黑鼠,AB俩人轮流抓鼠,过程是这样的:A先抓一只然后B抓一只然后跑掉一只。抓到白鼠时此人获胜,我们设定两者都没抓到则B获胜,A先抓,问A获胜的概率?

  


  

思路: 

我们设置:dp[i][j]表示当前里面有i只白鼠j只黑鼠时  A先手的胜率。自然dp[i][0]=1,dp[i][1]=i/(i+1),我们要求dp[w][b]

  
dp[i][j]的概率是要么直接当局获胜i/(i+j),要么后局获胜。即:?×dp[i-1][j-2]+?×dp[i][j-3] 两种情况一相加即可

  
dp[i][j]+=j/(i+j)*(j-1)/(i+j-1)*  i /(i+j-2)*dp[i-1][j-2];   //先手抓黑,后手抓黑,跑了只白的情况映射到dp[i-1][j-2]

  
dp[i][j]+=j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)*dp[i][j-3];    //先手抓黑,后手抓黑,跑了只黑的情况映射到dp[i][j-3]

  

  

#include 
using namespace std;
double dp[1005][1005];//dp[i][j]表示i只白鼠,j只黑鼠时,A先手的胜率
int main(){
	int w,b;
	cin>>w>>b;
	for(int i=1;i<=w;i++) dp[i][0]=1.0,dp[i][1]=1.0*i/(i+1);
	for(int i=1;i<=w;i++){
		for(int j=2;j<=b;j++){
			dp[i][j]=1.0*i/(i+j);//处理当前的获胜概率
			dp[i][j]+=1.0*j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)*dp[i-1][j-2];
			if(j>=3) dp[i][j]+=1.0*j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)*dp[i][j-3];
		}
	}
	printf("%.9lf",dp[w][b]);
	return 0;
}

你可能感兴趣的:(动态规划,算法)