【bzoj1419】Red is good 期望dp
题目描述
桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。
输入
一行输入两个数R,B,其值在0到5000之间
输出
在最优策略下平均能得到多少钱。
样例输入
5 1
样例输出
4.166666
题解
期望dp
设$f[i][j]$表示还有$i$张红牌和$j$张黑牌是最优策略的期望收益。
那么显然$f[i][j]=max(\frac i{i+j}(f[i-1][j]+1)+\frac j{i+j}(f[i][j-1]-1),0)$,因为当期望为负时可以选择不选。
这里为了避免边界条件而将数组平移了1位。
最终答案为$f[n][m]$,由于卡空间,需要使用滚动数组。
#include <cstdio>
#include <algorithm>
#define N 5010
using namespace std;
double f[2][N];
int main()
{
	int n , m , i , j , d;
	scanf("%d%d" , &n , &m);
	for(i = d = 1 ; i <= n + 1 ; i ++ , d ^= 1)
		for(j = 1 ; j <= m + 1 ; j ++ )
			if(i != 1 || j != 1)
				f[d][j] = max((f[d ^ 1][j] + 1) * (double)(i - 1) / (i + j - 2) + (f[d][j - 1] - 1) * (double)(j - 1) / (i + j - 2) , 0.0);
	printf("%.6lf\n" , f[(n + 1) & 1][m + 1] - 0.0000005);
	return 0;
}
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号