Millionaire-白书-概率dp
学了,记录下
你被邀请到某个电视节目中去玩下面这个游戏。一开始你有x元钱,接着进行m轮赌博,每一轮,可以将所持的任意一部分作为赌注,赌注不光可以是整数,也可以是小数,一分钱不押或全押都没有关系,每一轮都有p的概率可以赢,赢了赌注就好翻倍,输了赌注就没了,如果你最后有100万以上的钱的话,就可以把钱带回家。请计算当你采取最优策略时,获得100万以上的钱并带回家的概率。 0<=p<=1.0,1<=1<=1000000,1<=m<=15 样例输入: M,p, x 输入 :1 0.5 500000 输出 0.500000(一开始九全押上) 输入: 3,0.75 600000 输出0.843750
先计算样例:
从60000中拿出2500,如果赢了,再拿出75,可以 两轮赢0.75*0.75 ,要是第二轮输了,三轮赢全堵上赢0.75*0.25*0.75
或者第一轮输了,后面两轮全赢。三轮赢0.25*0.75*0.75。
白书解析:对于赌博,因为每次都能下注的金额是无限种可能的,所以,要将无限化有限(化连续为离散)
对于最后一次赌博:
1. 本金>= 1000 000 概率为1(直接就走了)
2. 本金>=5000 00 概率为P(赢了有,输了没)
3. 本金<5000 00 概率为0 (不管输赢都没有1000 000)
最后两轮:
1.本金 >=1000 000 概率为1
2. 本金 >=7500 00 概率为:P*P(两次都输才会输2500 00+5000 00)
3. 本金 >=5000 00 概率为:P(赢一次直接走,输了必定不可能到1000 000)
4. 本金 >=2500 00 概率为:(1-P)*(1-P)必须两次都赢
5. 本金 <2500 00 概率为:0 别想了 . . . .
某个范围内,即使所持的钱数不同,最后可以带钱回家的概率也是相同的
M轮 考虑 2^M+1 种情况。因此将金额进行离散化分段处理。
设dp[r+1][i]为进行到第r+1轮,现有i段钱能赢得百万的概率?那什么是最优策略呢?在第r轮要对拿出多少去赌好呢?。
不知道要拿多少,那我们枚举吧,假设r轮要拿出j个段钱去赌
那么dp[r+1][i]=max(dp[r][i+j]*p+dp[r][i-j]*(1-p)) j=min( i,n-i);
因为i+j<=n;i-j>=0; 所以 j<=i,j<n-i;
所以最后的答案就是dp[M][X所在的段]
#include<iostream>
#include<cstring>
using namespace std;typedef long long ll;
const int MAXN = 15;double dp[18][(1<<MAXN)+1];//dp[i][j]代表在运行了i伦的情况下有钱数j获胜的概率
int main(){int M,X;double P;scanf("%d %lf %d",&M,&P,&X);int n = 1<<M; dp[0][n] = 1.0; int m=(ll)X*n/1e6;for(int r=0;r<M;r++){ //r是赌博的轮数,0代表还没开始,M代表最后for(int i=0;i<=n;i++){ //i是情况序号,代表百万数据的 i/2^m int step = min(i,n-i);double t =0.0;int pt;for(int j=0;j<=step;j++){//从i个钱中拿出j个去赌,赢了后变i+j个,输了变i-j个,从中中出最优划分。 // if(t<dp[r][i+j]*P+dp[r][i-j]*(1-P))t=dp[r][i+j]*P+dp[r][i-j]*(1-P),pt=j; 观察最优策略 dp[r+1][i] =max(dp[r+1][i],dp[r][i+j]*P+dp[r][i-j]*(1-P)) ; }cout<<"dp["<<r+1<<"]["<<i<<"]="<<dp[r+1][i]<<"="<<dp[r][i+pt]<<"*"<<P<<"+ "<<dp[r][i-pt]<<"*"<<(1-P)<<","<<pt<<endl;}} printf("%.6f\n",dp[M][m]);return 0;
}
Millionaire-白书-概率dp相关推荐
- 【原创】概率DP总结 by kuangbin
概率DP主要用于求解期望.概率等题目. 转移方程有时候比较灵活. 一般求概率是正推,求期望是逆推.通过题目可以体会到这点. 首先先推荐几篇参考的论文: <信息学竞赛中概率问题求解初探> & ...
- 白书P61 - 点集配对问题
白书P61 - 点集配对问题 状压DP #include <iostream> #include <cstdio> #include <cstring> using ...
- 插头DP 概率DP / 期望DP
插头DP && 概率DP / 期望DP 写在前面: 插头DP P5056 [模板]插头dp 手写哈希表的方法: 拉链法的代码如下: 开放寻址法的代码如下: 接下来是这道题的代码实现: ...
- uestc1135邱老师看电影【概率dp】
邱老师看电影 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit S ...
- Codeforces 148D. Bag of mice(概率dp)
Codeforces 148D. Bag of mice(概率dp) Description The dragon and the princess are arguing about what to ...
- 动态规划报告(树形DP+概率DP
动态规划报告 树形dp 树形 DP,即在树上进行的 DP.由于树固有的递归性质,树形 DP 一般都是递归进行的.一般需要在遍历树的同时维护所需的信息 以一道题目为例 2022CCPC桂林站G Grou ...
- 2018.09.01 poj3071Football(概率dp+二进制找规律)
传送门 概率dp简单题. 设f[i][j]表示前i轮j获胜的概率. 如果j,k能够刚好在第i轮相遇,找规律可以发现j,k满足: (j−1)>>(i−1)(j−1)>>(i−1) ...
- Discovering Gold LightOJ - 1030[概率dp或者记忆化搜索]
题目大意:有一个[1,n][1,n][1,n]的数轴,数轴上的每个对应位置上都有金矿,你初始位置是1,然后你每次都会投色子决定你下一步跳到哪里,如果你跳出了nnn,那么你就要重新投.问你跳到nnn的时 ...
- poj 3071 Football(概率dp)
http://poj.org/problem? id=3071 大致题意:有2^n个足球队分成n组打比赛.给出一个矩阵a[][],a[i][j]表示i队赢得j队的概率.n次比赛的流程像这样France ...
最新文章
- javascript 异步实现方案
- bzoj 3743 [Coci2015]Kamp——树形dp+换根
- POJ 3041 Asteroids(最小点覆盖)题解
- shell脚本中的输入输出
- 敦泰FT6X06单层自容调屏
- JavaWeb(八)——JSP(Java服务器端页面)
- 文献记录(part5)--Robust biclustering by sparse singular value decomposition incorporating stability ...
- python list元素合并_python list 合并连接字符串的方法
- spring boot 实现发送邮箱验证码
- [设计模式]设计模式之禅抽象工厂模式
- 平面设计是什么?学会平面设计可以从事什么工作?
- 工程师视角的手游SDK
- DICOM医学影像协议
- 讲述 Android 开发代号的故事:Cupcake - Donut - Eclair - Flan - Gingerbread
- 目录操作的相关API 和 获取文件的属性信息
- jdbc(2)——之Class.forName(com.mysql.cj.jdbc.Driver)理解
- 【数据集】中国各类水文专业常用数据集合集
- 计算机网络常用的英文缩写,计算机和网络常用英文词汇和缩写
- 银河麒麟服务器操作系统安装VMware Tool
- 华师2020计算机专业宿舍,2020年华中师范大学新生宿舍环境条件,大一新生男生女生宿舍内部图片【多图】...