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 阅读(364) 评论(0) 编辑 收藏 举报