BZOJ 1419: Red is good

Sol

期望DP.

\(f[i][j]\) 表示剩下 \(i\) 张红牌, \(j\) 张黑牌的期望.

有转移方程.

\(f[i][j]=0,i=0\) 没有红色牌了,最优方案就是不再翻了.

\(f[i][j]=i,j=0\) 只剩下红色牌了,那就全部翻完啊.

\(f[i][j]=max\{ 0,\frac{i}{i+j}(f[i-1][j]+1)+\frac{j}{i+j} (f[i][j-1]-1)\}\) 翻到红色的概率是 \(\frac{i}{i+j}\) ,翻到黑色的概率是 \(\frac{j}{i+j}\) ,并且要取个下界 \(0\) .

精度很吃屎.

Code

/**************************************************************
    Problem: 1419
    User: BeiYu
    Language: C++
    Result: Accepted
    Time:1408 ms
    Memory:1352 kb
****************************************************************/
 
#include<cstdio>
#include<iostream>
using namespace std;
#define N 5005
double f[2][N];int r,b,cur;long long tmp;
int main(){
    scanf("%d%d",&r,&b);
    for(int i=0;i<=r;i++){
        for(int j=0;j<=b;j++){
            if(!i) f[cur][j]=0;else if(!j) f[cur][j]=i;
            else f[cur][j]=max(0.0,(i*(1+f[cur^1][j])+j*(-1+f[cur][j-1]))/(i+j));
        }cur^=1;
    }tmp=f[cur^1][b]*1e6;
    printf("%lld.",(long long)f[cur^1][b]);printf("%06lld\n",tmp%(long long)1e6);
    return 0;
}

  

posted @ 2016-09-11 20:26  北北北北屿  阅读(212)  评论(0编辑  收藏  举报