TopCoder SRM 420 div1 500 RedIsGood

看汤可因的论文写的题,概率dp。

讨论的是剩下i个红牌和j个黑牌时能得到的期望。

老套路,只不过这次在确定状态的时候多了一种选择,就是接下来的牌都不选了,这时候期望是0。

那么要是选择呢,这时候要么选择到了红牌,要么选择到了黑牌。

红牌的期望是(dp[i-1][j]+1)*(i*1.0/(i+j));黑牌的期望是(dp[i][j-1]-1)*(1.0*j/(i+j))。

两个加一起就是选牌的期望。

边界条件呢,就是j=0时dp[i][0]=i,因为肯定选红的嘛;i=0时dp[0][j]=0,因为肯定不选黑的嘛。

本来有这么个疑惑,为什么已经用最优策略选了,还会有期望。。

原因是你不知道下一张翻到的是红还是黑,是有概率的,而我们解题的过程是假设知道下面还有多少张红黑牌,来计算的。

代码:

#include<iostream>
using namespace std;
double dp[5010];
struct RedIsGood{
	double getProfit(int R, int B){
		int i,j;
		for(i=1;i<=R;i++){
			dp[0]=i;
			for(j=1;j<=B;j++)
				dp[j]=max(0.0,(dp[j-1]-1)*(1.0*j/(i+j))+(dp[j]+1)*(1.0*i/(i+j)));
		}
		return dp[B];
	}
};


 

你可能感兴趣的:(概率DP)