学了,记录下

你被邀请到某个电视节目中去玩下面这个游戏。一开始你有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相关推荐

  1. 【原创】概率DP总结 by kuangbin

    概率DP主要用于求解期望.概率等题目. 转移方程有时候比较灵活. 一般求概率是正推,求期望是逆推.通过题目可以体会到这点. 首先先推荐几篇参考的论文: <信息学竞赛中概率问题求解初探> & ...

  2. 白书P61 - 点集配对问题

    白书P61 - 点集配对问题 状压DP #include <iostream> #include <cstdio> #include <cstring> using ...

  3. 插头DP 概率DP / 期望DP

    插头DP && 概率DP / 期望DP 写在前面: 插头DP P5056 [模板]插头dp 手写哈希表的方法: 拉链法的代码如下: 开放寻址法的代码如下: 接下来是这道题的代码实现: ...

  4. uestc1135邱老师看电影【概率dp】

    邱老师看电影 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  S ...

  5. Codeforces 148D. Bag of mice(概率dp)

    Codeforces 148D. Bag of mice(概率dp) Description The dragon and the princess are arguing about what to ...

  6. 动态规划报告(树形DP+概率DP

    动态规划报告 树形dp 树形 DP,即在树上进行的 DP.由于树固有的递归性质,树形 DP 一般都是递归进行的.一般需要在遍历树的同时维护所需的信息 以一道题目为例 2022CCPC桂林站G Grou ...

  7. 2018.09.01 poj3071Football(概率dp+二进制找规律)

    传送门 概率dp简单题. 设f[i][j]表示前i轮j获胜的概率. 如果j,k能够刚好在第i轮相遇,找规律可以发现j,k满足: (j−1)>>(i−1)(j−1)>>(i−1) ...

  8. Discovering Gold LightOJ - 1030[概率dp或者记忆化搜索]

    题目大意:有一个[1,n][1,n][1,n]的数轴,数轴上的每个对应位置上都有金矿,你初始位置是1,然后你每次都会投色子决定你下一步跳到哪里,如果你跳出了nnn,那么你就要重新投.问你跳到nnn的时 ...

  9. poj 3071 Football(概率dp)

    http://poj.org/problem? id=3071 大致题意:有2^n个足球队分成n组打比赛.给出一个矩阵a[][],a[i][j]表示i队赢得j队的概率.n次比赛的流程像这样France ...

最新文章

  1. javascript 异步实现方案
  2. bzoj 3743 [Coci2015]Kamp——树形dp+换根
  3. POJ 3041 Asteroids(最小点覆盖)题解
  4. shell脚本中的输入输出
  5. 敦泰FT6X06单层自容调屏
  6. JavaWeb(八)——JSP(Java服务器端页面)
  7. 文献记录(part5)--Robust biclustering by sparse singular value decomposition incorporating stability ...
  8. python list元素合并_python list 合并连接字符串的方法
  9. spring boot 实现发送邮箱验证码
  10. [设计模式]设计模式之禅抽象工厂模式
  11. 平面设计是什么?学会平面设计可以从事什么工作?
  12. 工程师视角的手游SDK
  13. DICOM医学影像协议
  14. 讲述 Android 开发代号的故事:Cupcake - Donut - Eclair - Flan - Gingerbread
  15. 目录操作的相关API 和 获取文件的属性信息
  16. jdbc(2)——之Class.forName(com.mysql.cj.jdbc.Driver)理解
  17. 【数据集】中国各类水文专业常用数据集合集
  18. 计算机网络常用的英文缩写,计算机和网络常用英文词汇和缩写
  19. 银河麒麟服务器操作系统安装VMware Tool
  20. 华师2020计算机专业宿舍,2020年华中师范大学新生宿舍环境条件,大一新生男生女生宿舍内部图片【多图】...

热门文章

  1. C++ 中的容器类详解
  2. 2022全年度吸尘器十大热门品牌销量榜单
  3. Android开发艺术探索五 RemoteView
  4. YOTTA 企业云盘解决教育信息化痛点
  5. Java获取指定时区的时间格式
  6. Spock代码讲解 - mock第三方依赖、if else 分支测试
  7. MySQL序列以及生成主键编号记录
  8. springboot 导出CSV
  9. SOC芯片中VIP和IP之间的路由关系
  10. 指针方法实现将两个有序的数组合并成一个有序数组