1. 程式人生 > >Red is good

Red is good

size emp spa ron alt opened pri close pan

題目描述

桌面上有R張紅牌和B張黑牌,隨機打亂順序後放在桌面上,開始一張一張地翻牌,翻到紅牌得到1美元,黑牌則付出1美元。可以隨時停止翻牌,在最優策略下平均能得到多少錢。

輸入

一行輸入兩個數R,B,其值在0到5000之間

輸出

在最優策略下平均能得到多少錢。 solution f[i][j]表示當前拿i個紅球,j個黑球時的期望錢數 f[i][j]=max(0,( f[i-1][j]+1)*(i/(j+i)) + (f[i][j-1]-1)*(j/(i+j)) ) f[i][0]=i 由於內存,開滾動數組 技術分享
 1 #include<cstdio>
 2 #include<cstring>
 3
#include<iostream> 4 #define dd double 5 using namespace std; 6 7 int R,B,now; 8 dd f[2][5066]; 9 10 int main(){ 11 12 scanf("%d%d",&R,&B); 13 14 now=0; 15 dd temp; 16 for(int i=1;i<=R;++i) 17 { 18 now^=1; 19 f[now][0]=i; 20 for
(int j=1;j<=B;++j) 21 { 22 temp=(f[now][j-1]-1)*(dd)(j)/(dd)(i+j)+(f[now^1][j]+1)*(dd)(i)/(dd)(i+j); 23 f[now][j]=temp>0?temp:0; 24 } 25 } 26 printf("%.6lf",f[now][B]-0.0000005); 27 28 //while(1); 29 }
code

Red is good