DestinHistoire

 

BZOJ-1419 Red is good(概率dp)

题目描述

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

分析

  设 \(dp[i][j]\) 为选了 \(i\) 张红牌,\(j\) 张黑牌最优策略下的期望收益。由于翻牌后的收益可能为负,但是最优策略不可能出现负值,所以 \(dp[i][j]\) 必然大于等于 \(0\)

  状态转移方程:

\[dp[i][j]=\max\Big(0,\frac{i}{i+j}\times (dp[i-1][j]+1)+\frac{j}{i+j}\times (dp[i][j-1]-1)\Big) \]

  数组滚动掉一维。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=5010;
double dp[2][N];
int main()
{
    int R,B;
    cin>>R>>B;
    for(int i=1;i<=R;i++)
    {
        dp[i&1][0]=i;
        for(int j=1;j<=B;j++)
            dp[i&1][j]=max(0.0,1.0*i/(i+j)*(dp[!(i&1)][j]+1)+1.0*j/(i+j)*(dp[i&1][j-1]-1));
    }
    printf("%.6lf\n",dp[R&1][B]-5e-7);
    return 0;
}

posted on 2020-12-09 19:27  DestinHistoire  阅读(60)  评论(0编辑  收藏  举报

导航