题目:
题解:
这种有几个状态问你收手的情况,一般设计f[i][j]表示红牌剩i张,黑牌剩j张的最优钱数
我们可以考虑倒推,
f[i][j]=max(0.0,(f[i−1][j]+1)∗p+(f[i][j−1]−1)∗(1−p))
f
[
i
]
[
j
]
=
m
a
x
(
0.0
,
(
f
[
i
−
1
]
[
j
]
+
1
)
∗
p
+
(
f
[
i
]
[
j
−
1
]
−
1
)
∗
(
1
−
p
)
)
,这个max就是最优啊
这题目还卡空间?我们可以滚动一维数组
代码:
#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
const int N=5005;
const int base=1e6;
double f[2][N];
void write(double x)
{
x*=base;
x=floor(x);
x/=base;
printf("%.6lf",x);
}
int main()
{
int n,m;scanf("%d%d",&n,&m);
for (int i=0;i<=n;i++)
{
f[i&1][0]=i;
for (int j=1;j<=m;j++)
{
double p=i*1.0/(i+j)*1.0;
f[i&1][j]=max(f[i&1][j],(f[(i-1)&1][j]+1)*p+(f[i&1][j-1]-1)*(1-p));
}
}
write(f[n&1][m]);
}