zoukankan      html  css  js  c++  java
  • B20J_1419_Red Is Good_期望DP

    B20J_1419_red is good_期望DP

    题意:

    有R张红牌和B张黑牌,一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。

    分析:

    期望DP。

    状态描述:f[i][j]表示当前有i张红牌,j张黑牌能够获得钱数的期望。

    转移:考虑当前翻开的是什么牌。

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

    对最优策略的理解:如果当前获得钱为负数就没有必要转移了。

    其他:1.题目要求截断保留6位小数。2.空间需要滚动优化。

    代码:

    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    #define du double
    #define eps 1e-8
    du f[2][5010],ans;
    int r,b;
    int main()
    {
        scanf("%d%d",&r,&b);
        for(int i=1;i<=r;i++)
        {
            f[i&1][0]=i;
            for(int j=1;j<=b;j++)
            {
                f[i&1][j]=max(0.0,
                           (f[(i-1)&1][j]+1)*i/(1.0*(i+j))
                             +
                             (f[i&1][j-1]-1)*j/(1.0*(i+j)));
            }
        }
        printf("%.6lf",max(0.0,f[r&1][b]-0.0000005));
    }
     
    /***************************************************************
        Problem: 2453
        User: 20170105
        Language: C++
        Result: Accepted
        Time:432 ms
        Memory:1040 kb
    ****************************************************************/
    

      

  • 相关阅读:
    Leetcode86.分隔链表
    Leetcode39.组合总和
    Leetcode31.下一个排列
    剑指Offer35.复杂链表复制
    剑指Offer14-I.剪绳子
    剑指Offer38.字符串的排序
    Leetcode29.两数相除
    232. Implement Queue using Stacks
    程序员跳槽指南
    226. Invert Binary Tree
  • 原文地址:https://www.cnblogs.com/suika/p/8411124.html
Copyright © 2011-2022 走看看