BZOJ 1419: Red is good

时间:2023-03-09 00:06:41
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;
}