bzoj1419 Red is good

Red is good

Time Limit: 10 Sec Memory Limit: 64 MB

Description

桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付
出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。

Input

一行输入两个数R,B,其值在0到5000之间

Output

在最优策略下平均能得到多少钱。

Sample Input

5 1

Sample Output

4.166666

HINT

输出答案时,小数点后第六位后的全部去掉,不要四舍五入.

这道题,空间,滚动数组。
最优策略:如果当前局面的期望为负,则直接停止。(你玩个游戏就人脑dp??那你还用玩这个??)


#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e3 + 5;
double dp[3][maxn];
int R, B;

int main()
{
	scanf("%d%d", &R, &B);
	for(int i = 1; i <= R; ++i)
	{
		int t = i % 2; dp[t][0] = i;
		for(int j = 1; j <= B; ++j)
			dp[t][j] = max(0.0, (dp[t][j - 1] - 1) * ((double)(j) / (i + j)) + (dp[t ^ 1][j] + 1) * ((double)(i) / (i + j)));
	}
	printf("%.6lf\n", dp[R % 2][B] - 0.0000005);
	return 0;
}

心如花木,向阳而生。
posted @ 2018-03-20 21:05  沛霖  阅读(110)  评论(0编辑  收藏  举报