本文主要是介绍BZOJ1419: Red is good(期望dp),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Description
桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。
Input
一行输入两个数R,B,其值在0到5000之间
Output
在最优策略下平均能得到多少钱。
Sample Input
5 1
Sample Output
4.166666
HINT
输出答案时,小数点后第六位后的全部去掉,不要四舍五入.
Source
思路:
f [ i ] [ j ] f[i][j] f[i][j]定义有i张红牌,j张黑牌的期望获得
那么 f [ i ] [ 0 ] = i f[i][0] = i f[i][0]=i
f [ i ] [ j ] = m a x ( 0.0 , ( f [ i − 1 ] [ j ] + 1 ) ∗ i / ( i + j ) + ( f [ i ] [ j − 1 ] − 1 ) ∗ j / ( i + j ) ) f[i][j] = max(0.0,(f[i-1][j]+1)*i/(i+j) + (f[i][j-1]-1)*j/(i+j)) f[i][j]=max(0.0,(f[i−1][j]+1)∗i/(i+j)+(f[i][j−1]−1)∗j/(i+j))
#include <cstdio>
#include <algorithm>
#include <cstring>using namespace std;double f[5005][5005];int main()
{int n,m;scanf("%d%d",&n,&m);for(int i = 1;i <= n;i++){f[i][0] = (double)i;for(int j = 1;j <= m;j++){f[i][j] = max(0.0,(f[i - 1][j] + 1.0) * i/(i+j) + (f[i][j - 1] - 1.0) * j/(i+j));}}printf("%.6f\n",f[n][m] - 0.0000005);return 0;
}
这篇关于BZOJ1419: Red is good(期望dp)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!