看了眼数据范围……n^2啊……不怂了
似乎要炸空间?滚一下
可以随时终止的话每个状态和0取个max就好
f[i][j]表示i个红j个黑的期望收益,显然可以通过算 下一个拿的是红还是黑 来转移
代码:
#include<bits/stdc++.h>
#define MAXN 5005
using namespace std; int n,m;
long double f[2][MAXN];
int main(){
scanf("%d%d",&n,&m);
for(int now=1,i=1;now<=n;++now,i = now&1){
f[i][0] = now;
for(int j=1;j<=m;++j){
f[i][j] = max( (long double)0 , (long double)now/(now+j) * (f[i^1][j] + 1) + (long double)j/(now+j) * (f[i][j-1] - 1));
}
}
printf("%d.%06lld",(int)floor(f[n&1][m]),((long long)floor((f[n&1][m]*1000000ll)))%1000000);
return 0;
}