我 是 Z Z

概率好玄啊(好吧是我太弱.jpg

Description

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

数据范围与提示

输出答案时,小数点后第六位后的全部去掉,不要四舍五入.

Solution

乍一看感觉是道普通求期望,然后就在错误的路上速度与激情。。其实不难,但也是道挺好的概率dp

由于要求的是最佳方案,所以并不是所有方案的平均值,即不能把期望作为最终答案。所以该怎么做?遇事不决就dp啊!

考虑开二维状态数组f[r][b],一维已抽出的红牌,一维已抽出的黑牌。那么对于f[i][j],有i/(i+j)的平均最优解是由抽出红牌转移而来,j/(i+j)的平均最优解是由抽出黑牌转移而来。即:

f[i][j]=(i×(f[i-1][j]+1)+j×f[i][j-1])/(i+j)

又因为要求最优解,所以抽牌赔钱不如不抽,即可将值为负的状态转移为0。

所以有状态转移方程:

f[i][j]=max(0.0,((f[i-1][j]+1)×i+(f[i][j-1]-1)×j)/(i+j))

几点注意:

1.输出不能四舍五入,我在网上搜的几种避免四舍五入的方式不知为何都没用,只能手模了一个。。

1 ans=((int)(ans*1e6))/1e6;
2 printf("%.6lf",ans);

2.题面空间限制64m,5000×5000显然会炸,要开滚动数组。


代码如下:

 1 #include<bits/stdc++.h>
2 using namespace std;
3 int r,b,n;
4 double f[5001][5001],ans;
5 inline int read()
6 {
7 int x=0,f=1;
8 char ch=getchar();
9 while(ch<'0'||ch>'9')
10 {
11 if(ch=='-')
12 f=-1;
13 ch=getchar();
14 }
15 while(ch>='0'&&ch<='9')
16 {
17 x=(x<<1)+(x<<3)+(ch^48);
18 ch=getchar();
19 }
20 return x*f;
21 }
22 int main()
23 {
24 r=read(); b=read();
25 for(int i=1;i<=r;i++)
26 {
27 f[i&1][0]=i;
28 for(int j=1;j<=b;j++)
29 f[i&1][j]=max(0.0,((f[i-1&1][j]+1)*i+(f[i&1][j-1]-1)*j)/(i+j));
30 }
31 ans=((int)(f[r&1][b]*1e6))/1e6;
32 printf("%.6lf",ans);
33 return 0;
34 }

蒟蒻代码QAQ

(附身边高人JYFHYX T60的暴力搜索:

 1 using namespace std;
2 int j,d;
3 double r,b;
4 double f[5001][5001];
5 inline double dp(double black,double red)
6 {
7 j=black,d=red;
8 if(f[j][d])
9 return f[j][d];
10 if(black+red==0)
11 return 0;
12 return f[j][d]=(red/(black+red))(max(dp(black,red-1.0),0.0)+1)+(black/(black+red))(max(dp(black-1.0,red),0.0)-1);
13 }
14 int main()
15 {
16 cin>>r>>b;
17 int n=r+b;
18 for(int i=1;i<=r;i++)
19 {
20 f[0][i]=i;
21 }
22 for(int i=1;i<=b;i++)
23 f[i][0]=-i;
24 double ans;
25 ans=dp(b,r);
26 ans=((int)(ans*1e6))/1e6;
27 printf("%.6lf",ans);
28 }

爆搜

#include<bits/stdc++.h>
using namespace std;
double r,b;
double f[5001][5001];
inline double dp(double black,double red)
{
int j=black,b=red;
if(f[j][b])
return f[j][b];
if(black+red==0)
return 0;
return f[j][b]=(red/(black+red))*(max(dp(black,red-1.0),0.0)+1)+(black/(black+red))*(max(dp(black-1.0,red),0.0)-1);
}
int main()
{
cin>>r>>b;
int n=r+b;
for(int i=1;i<=r;i++)
{
f[0][i]=i;
}
for(int i=1;i<=b;i++)
f[i][0]=-i;
double ans;
ans=dp(b,r);
ans=((int)(ans*1e6))/1e6;
printf("%.6lf",ans);
}

缩进版

【BZOJ 1419】Red is good [概率DP]的更多相关文章

  1. BZOJ 1419 Red is good ——期望DP

    定义f[i][j]表示还剩i张红牌,j张黑牌的时候能取得的期望最大值 显然有$f[i][j]=max(0,\frac {i}{i+j}(f[i-1][j]+1)+ \frac {j}{i+j}(f[i ...

  2. BZOJ 1419: Red is good 期望dp

    数学期望可以理解成一个 DAG 模型. Code: #include <bits/stdc++.h> #define N 5003 #define ll long long #define ...

  3. BZOJ 3143 [Hnoi2013]游走 ——概率DP

    概率DP+高斯消元 与博物馆一题不同的是,最终的状态是有一定的概率到达的,但是由于不能从最终状态中出来,所以最后要把最终状态的概率置为0. 一条边$(x,y)$经过的概率是x点的概率$*x$到$y$的 ...

  4. bzoj 1419 Red is good - 动态规划 - 概率与期望

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

  5. 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 ...

  6. BZOJ 1419: Red is good

    Sol 期望DP. \(f[i][j]\) 表示剩下 \(i\) 张红牌, \(j\) 张黑牌的期望. 有转移方程. \(f[i][j]=0,i=0\) 没有红色牌了,最优方案就是不再翻了. \(f[ ...

  7. BZOJ.1076.[SCOI2008]奖励关(概率DP 倒推)

    题目链接 BZOJ 洛谷 真的题意不明啊.. \(Description\) 你有k次选择的机会,每次将从n种物品中随机一件给你,你可以选择选或不选.选择它会获得这种物品的价值:选择一件物品前需要先选 ...

  8. BZOJ 3640: JC的小苹果 [概率DP 高斯消元 矩阵求逆]

    3640: JC的小苹果 题意:求1到n点权和\(\le k\)的概率 sengxian orz的题解好详细啊 容易想到\(f[i][j]\)表示走到i点权为j的概率 按点权分层,可以DP 但是对于\ ...

  9. BZOJ 3143: [Hnoi2013]游走 [概率DP 高斯消元]

    一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分 ...

随机推荐

  1. Baidu初试题分享(Java高级工程师)

    [特别声明:文章仅用来借鉴学习,不用于其他商业化活动] 1.JDK和JRE区别? JDK是整个JAVA的核心,包括了Java运行环境JRE,一堆Java工具和Java基础的类库.通过JDK开发人员将源 ...

  2. 383 day10缓冲流、转换流、序列化流

    day10[缓冲流.转换流.序列化流] 主要内容 缓冲流 转换流 序列化流 打印流 教学目标 [ ] 能够使用字节缓冲流读取数据到程序 [ ] 能够使用字节缓冲流写出数据到文件 [ ] 能够明确字符缓 ...

  3. 字符串出现的topK问题

    /** * return topK string * @param strings string字符串一维数组 strings * @param k int整型 the k * @return str ...

  4. 2. Go并发编程--GMP调度

    目录 1. 前言 1.1 Goroutine 调度器的 GMP 模型的设计思想 1.2 GMP 模型 1.3. 有关M和P的个数问题 1.4 P 和 M 何时会被创建 2. 调度器的设计策略 3. g ...

  5. Java基础系列(39)- 二维数组

    多维数组 多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组. 二维数组 int a[][]=new int[2][5]; 解析:以上二维数组a可以看成一个 ...

  6. Spring Cloud Gateway 没有链路信息,我 TM 人傻了(上)

    本系列是 我TM人傻了 系列第五期[捂脸],往期精彩回顾: 升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了 这个大表走索引字段查询的 SQL 怎么就成全扫描了,我TM人傻了 获取异 ...

  7. springBoot 基础入门

    来处:是spring项目中的一个子项目 优点  (被称为搭建项目的脚手架)         减少一切xml配置,做到开箱即用,快速上手,专注于业务而非配置     从创建项目上: -- 快速创建独立运 ...

  8. python FastAPI 初接触

    先吹一波: 原来写接口可以这么简单!!! 简单到没朋友 . 中文官网:https://fastapi.tiangolo.com/zh/tutorial/header-params/ 且天然支持异步处理 ...

  9. 『GoLang』接口

    接口是什么 Go 语言不是一种 "传统" 的面向对象编程语言:它里面没有类和继承的概念. 但是 Go 语言里有非常灵活的 接口 概念,通过它可以实现很多面向对象的特性.接口提供了一 ...

  10. 鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗 | 百篇博客分析OpenHarmony源码 | v61.02

    百篇博客系列篇.本篇为: v61.xx 鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...