zoukankan      html  css  js  c++  java
  • 【bzoj1419】Red is good 期望dp

    题目描述

    桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。

    输入

    一行输入两个数R,B,其值在0到5000之间

    输出

    在最优策略下平均能得到多少钱。

    样例输入

    5 1

    样例输出

    4.166666


    题解

    期望dp

    设$f[i][j]$表示还有$i$张红牌和$j$张黑牌是最优策略的期望收益。

    那么显然$f[i][j]=max(frac i{i+j}(f[i-1][j]+1)+frac j{i+j}(f[i][j-1]-1),0)$,因为当期望为负时可以选择不选。

    这里为了避免边界条件而将数组平移了1位。

    最终答案为$f[n][m]$,由于卡空间,需要使用滚动数组。

    #include <cstdio>
    #include <algorithm>
    #define N 5010
    using namespace std;
    double f[2][N];
    int main()
    {
    	int n , m , i , j , d;
    	scanf("%d%d" , &n , &m);
    	for(i = d = 1 ; i <= n + 1 ; i ++ , d ^= 1)
    		for(j = 1 ; j <= m + 1 ; j ++ )
    			if(i != 1 || j != 1)
    				f[d][j] = max((f[d ^ 1][j] + 1) * (double)(i - 1) / (i + j - 2) + (f[d][j - 1] - 1) * (double)(j - 1) / (i + j - 2) , 0.0);
    	printf("%.6lf
    " , f[(n + 1) & 1][m + 1] - 0.0000005);
    	return 0;
    }
    

     

  • 相关阅读:
    【PHPStorm使用手册】如何设置字体大小?
    Django——admin组件简单入门
    cookie与session
    Django
    练习题
    线程理论之大白话
    队列
    初识gevent模块
    Python第三方模块安装
    Python标准模块_concurrent.futures
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/7392023.html
Copyright © 2011-2022 走看看