BZOJ-1419 Red is good(概率dp)
题目描述
桌面上有 \(R\) 张红牌和 \(B\) 张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到 \(1\) 美元,黑牌则付出 \(1\) 美元。可以随时停止翻牌,在最优策略下平均能得到多少钱(\(0\leq R,B\leq 5000\))。
分析
设 \(dp[i][j]\) 为选了 \(i\) 张红牌,\(j\) 张黑牌最优策略下的期望收益。由于翻牌后的收益可能为负,但是最优策略不可能出现负值,所以 \(dp[i][j]\) 必然大于等于 \(0\)。
状态转移方程:
\[dp[i][j]=\max\Big(0,\frac{i}{i+j}\times (dp[i-1][j]+1)+\frac{j}{i+j}\times (dp[i][j-1]-1)\Big)
\]
数组滚动掉一维。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=5010;
double dp[2][N];
int main()
{
int R,B;
cin>>R>>B;
for(int i=1;i<=R;i++)
{
dp[i&1][0]=i;
for(int j=1;j<=B;j++)
dp[i&1][j]=max(0.0,1.0*i/(i+j)*(dp[!(i&1)][j]+1)+1.0*j/(i+j)*(dp[i&1][j-1]-1));
}
printf("%.6lf\n",dp[R&1][B]-5e-7);
return 0;
}
posted on 2020-12-09 19:27 DestinHistoire 阅读(60) 评论(0) 编辑 收藏 举报