【bzoj1419】Red is good 期望dp
阿新 • • 發佈:2019-02-12
f[i][j]表示有i張紅j張黑情況下的期望收益
f[i][j]=max(0,i/(i+j)*(f[i-1][j]+1)+j/(i+j)*(f[i][j-1]-1))
轉移是和很好理解的,如果選了的期望收益<0,那麼不如不選
注:
1、直接開陣列會爆記憶體,所以要用滾動陣列
2、注意不要四捨五入
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #define maxn 5010 using namespace std; double f[2][maxn]; int n,m; double cal(double x) { if (x<0) return 0; else return x; } int main() { scanf("%d%d",&n,&m); for (int i=0,now=0;i<=n;i++,now^=1) { f[now][0]=i; for (int j=1;j<=m;j++) f[now][j]=cal(i/(double)(i+j)*(f[now^1][j]+1)+j/(double)(i+j)*(f[now][j-1]-1)); } long long ans=floor(f[n&1][m]*1000000); printf("%lld.%06lld",ans/1000000,ans%1000000); return 0; }