桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<ctype.h>
#include<math.h>
#include<queue>
using namespace std;
int n, m, Sum, Count, flag;
int a[110000];
double dp[2][5005];
double Max( double a,double b )
{
return a>b?a:b;
}
int main()
{
int i, j, k, t, cas=0;
while( scanf( "%d%d",&n, &m )!=-1 )
{
memset( dp,0,sizeof( dp ) );
for( i=0;i<=n;i++ )( 剩下i个红牌和j个黑牌时所获得期望 ,每一步都找出来最优( 遍历 ),从 剩下0,0 到 剩下n,m( 逆序思想 ),dp全过程找到最优。
{
int temp=i&1;
for( j=0;j<=m;j++ )
{
if( i+j )
{
if( j==0 )
{
dp[temp][j]=dp[temp^1][j]+1;
}
else if( i )
{
dp[temp][j]=Max( dp[temp][j],( dp[temp^1][j]+1 )*( 1.0*i/( i+j ) )+( dp[temp][j-1]-1 )*( 1.0*j/( i+j ) ) );
}
}
}
memset( dp[temp^1],0,sizeof( dp[temp^1] ) );
}
printf( "%lf\n",dp[n&1][m] );
}
return 0;
}