【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
" , f[(n + 1) & 1][m + 1] - 0.0000005);
	return 0;
}

 

原文地址:https://www.cnblogs.com/GXZlegend/p/7392023.html