【BZOJ 1419】1419: Red is good (概率DP)

1419: Red is good

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 807  Solved: 343

Description

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

Input

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

Output

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

Sample Input

5 1

Sample Output

4.166666

HINT

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

Source

【分析】

  概率DP这种东西想清楚就没问题。

  f[i][j]表示已经翻了i红j黑,之后最优策略下的期望得分。

  因为直接n^2数组0msT了,所以滚动了一下。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<cmath>
 7 using namespace std;
 8 #define Maxn 5010
 9
10 double f[2][Maxn];
11
12 double mymax(double x,double y) {return x>y?x:y;}
13
14 int main()
15 {
16     int n,m;
17     scanf("%d%d",&n,&m);
18     f[n&1][m]=0;
19     for(int i=n;i>=0;i--)
20     {
21         int p=i&1,pp=p^1;
22         for(int j=m;j>=0;j--)
23         {
24              if(n==i) f[p][j]=mymax(f[p][j+1]-1,0);
25              else if(m==j) f[p][j]=mymax(f[pp][j]+1,0);
26              else f[p][j]=mymax((f[pp][j]+1)*(n-i)/(n+m-i-j)+(f[p][j+1]-1)*(m-j)/(n+m-i-j),0);
27         }
28     }
29     printf("%.6lf",f[0][0]-0.0000005);
30     return 0;
31 }

2017-04-21 16:08:56

时间: 2024-10-16 06:04:39

【BZOJ 1419】1419: Red is good (概率DP)的相关文章

BZOJ 1246 &amp; 有点不一样的概率DP

题意: 题意够坑的啊... 一个色子有n个面,第k次掷出一个加上这个k.求掷出所有面的期望值. 我一直以为值是色子面上的... 那么问题来了在色子面上怎么做...n还是1w级别... SOL: 对着理解错的题面想了半天还是没想出来比O(n^2)强的算法.. 这题跟上次lightoj那道丝帛题有点像,但那个每个面都可以看做一样的所以丝帛很多... 空间也一样要炸,然后不行看题解...发现原来是这样... 感觉对着原来的问题每种情况都相当于是独立的...感觉除了撞鸭其它没法搞啊... 然而感觉改了以

bzoj 3191 [JLOI2013]卡牌游戏 概率dp

题面 题目传送门 解法 设\(f_{i,j}\)表示总共\(i\)个人,第\(j\)个人最终获胜的概率 枚举当前选择的是哪一张卡,那么就知道下一轮被淘汰的是谁了,假设是\(x\) 显然,下一轮的庄家就是\(x\)的下一个人 如果\(x=j\),那么可以不用管这种情况 如果\(x>j\),那么\(j\)在下一轮的编号为\(i-x+j\),否则为\(j-x\) 对应的两种情况转移一下即可 时间复杂度:\(O(n^2m)\) 代码 #include <bits/stdc++.h> #defin

【概率DP/高斯消元】BZOJ 2337:[HNOI2011]XOR和路径

2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 682  Solved: 384[Submit][Status][Discuss] Description 几乎是一路看题解过来了.. 拖了一个星期的题目- - 已然不会概率DP(说得好像什么时候会过一样),高斯消元(打一次copy一遍). 发现异或题目的新解决方法:按位处理.. 发现DP新方法:高斯消元. f[k][i]代表第k位权值起点为i到终点时答案

BZOJ 2318: Spoj4060 game with probability Problem( 概率dp )

概率dp... http://blog.csdn.net/Vmurder/article/details/46467899 ( from : [辗转山河弋流歌 by 空灰冰魂] ) 这个讲得很好 , 推推公式就可以 O( n ) , 但是 n 最大是99999999 , 怎么破....其实 n 很大时概率基本不动了...所以只需计算到某一个较大值时就可以停下来了... ----------------------------------------------------------------

bzoj 3450 Tyvj1952 Easy (概率dp)

3450: Tyvj1952 Easy Description 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(我们来简化一下这个游戏的规则有n次点击要做,成功了就是o,失败了就是x,分数是按comb计算的,连续a个comb就有a*a分,comb就是极大的连续o.比如ooxxxxooooxxx,分数就是2*2+4*4=4+16=20.Sevenkplus闲的慌就看他打了一盘,有些地方跟运气无关要么是o要么是x,有些地方o或者x各有50%的可能性,用?号来表示.比如oo?

【BZOJ 3652】大新闻 数位dp+期望概率dp

并不难,只是和期望概率dp结合了一下.稍作推断就可以发现加密与不加密是两个互相独立的问题,这个时候我们分开算就好了.对于加密,我们按位统计和就好了;对于不加密,我们先假设所有数都找到了他能找到的最好的匹配(就是异或后为二进制最高位与n-1相等的最大数)并且算出其异或后的总和,然后我们按位贪心,带着所有的数(一开始我们假设所有的数是小于等于二进制最高位与n-1相等的最大数的所有数)从高位走向低位,每走一步,如果这一位是0,就会导致一半的数在这一位不能是1,减去这一半的数在这一位上的贡献,如果这一位

简单概率DP——hdu4405

题目描述: Hzz loves aeroplane chess very much. The chess map contains N+1 grids labeled from 0 to N. Hzz starts at grid 0. For each step he throws a dice(a dice have six faces with equal probability to face up and the numbers on the faces are 1,2,3,4,5,6

Codeforces 28C [概率DP]

/* 大连热身D题 题意: 有n个人,m个浴室每个浴室有ai个喷头,每个人等概率得选择一个浴室. 每个浴室的人都在喷头前边排队,而且每个浴室内保证大家都尽可能均匀得在喷头后边排队. 求所有浴室中最长队伍的期望. 思路: 概率dp dp[i][j][k]代表前i个浴室有j个人最长队伍是k的概率. 枚举第i个浴室的人数.然后转移的时候其实是一个二项分布. */ #include<bits/stdc++.h> using namespace std; int jilu[55]; double dp[

hdu 3076 ssworld VS DDD (概率dp)

///题意: /// A,B掷骰子,对于每一次点数大者胜,平为和,A先胜了m次A赢,B先胜了n次B赢. ///p1表示a赢,p2表示b赢,p=1-p1-p2表示平局 ///a赢得概率 比一次p1 两次p0*p1 三次 p0^2*p1,即A赢的概率为p1+p*p1+p^2*p1+...p^n*p1,n->无穷 ///即a_win=p1/(1-p);b_win=p2/(1-p); ///dp[i][j]表示a赢了j次,b赢了i次的概率 ///dp[i][j]=dp[i-1][j]*b_win+dp[