山东济南彤昌机械科技有限公司 山东济南江鹏工贸游有限公司

bzoj 1419 Red is good(期望DP)

 

【题意】

 

    R红B蓝,选红得1选蓝失1,问最优状态下的期望得分。

 

【思路】

 

    设f[i][j]为i个Rj个B时的最优期望得分,则有转移式为:

        f[i][j]=max{ 0,(f[i-1][j]+1)*(i/(i+j))+(f[i][j-1]-1)*(j/(i+j)) }

    有i/(i+j)的可能性得1分,有j/(i+j)的可能性失1分,再加上原来的分数,则期望得分为上式。

    需要用下滚动数组。直接按位数输出采用的四舍五入的方法,所以还需要减去5e-7。

 

【代码】

 

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 
 5 const int N = 5e3+10;
 6 
 7 int cur,R,B;
 8 double f[2][N];
 9 
10 int main()
11 {
12     scanf("%d%d",&R,&B);
13     for(int i=1;i<=R;i++) {
14         cur^=1;
15         f[cur][0]=i;
16         for(int j=1;j<=B;j++)
17             f[cur][j]=max((double)0,(1+f[cur^1][j])*((double)i/(i+j))+(-1+f[cur][j-1])*((double)j/(i+j)));
18     }
19     printf("%.6f",f[cur][B]-5e-7);
20     return 0;
21 }

 

posted on 2016-03-21 15:04  hahalidaxin  阅读(339)  评论(0编辑  收藏  举报