【BZOJ1419】Red is good 期望DP

来源:互联网 发布:ubuntu 安装iso文件 编辑:程序博客网 时间:2024/05/21 09:58

题目大意

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

  0R,B5000

题解

  设fi,j为还剩下i张红牌和j张黑牌时的最大收益。每次可以选择翻或者不翻。

fi,0f0,ifi,j=i=0=max(0,i(fi1,j+1)+j(fi,j11)i+j)

  最后答案是fR,B

  辣鸡出题人卡空间要用滚动数组才能过

  时间复杂度:O(RB)

代码

#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>#include<ctime>#include<utility>using namespace std;typedef long long ll;typedef pair<int,int> pii;double f[2][5010];int main(){//  freopen("bzoj1419.in","r",stdin);    int n,m;    scanf("%d%d",&n,&m);    int i,j;    int t=0;    for(i=0;i<=n;i++)    {        t^=1;        f[t][0]=i;        for(j=1;j<=m;j++)            f[t][j]=max(0.,(f[t^1][j]+1)*double(i)/(i+j)+(f[t][j-1]-1)*double(j)/(i+j));    }    ll s=f[t][m]*1000000;    printf("%lld.%.6lld\n",s/1000000,s%1000000);    return 0;}
原创粉丝点击