题意:最开始你有x元钱,要进行M轮赌博。每一轮赢的概率为P,你可以选择赌与不赌,如果赌也可以将所持的任意一部分钱作为赌注(可以是整数,也可以是小数)。如果赢了,赌注将翻倍;输了赌注则没了。在M轮赌博结束后,如果你持有的钱在100万元以上,就可以把这些钱带回家。问:当你采取最优策略时,获得100万元以上的钱并带回家的概率是多少。
samples:
input:
M = 1, P = 0.5, X = 500000
output:
0.500000
input:
M = 3, P = 0.75, X = 600000
output:
0.843750

类型:动态规划&离散化思想
连续性是本问题的一大特点。每一轮可押的金钱不一定是整数,因而有无限种可能,所以无法穷竭搜索。
分析如下:
假设前M-1轮的赌博后,还持有x‘元。对于最后一轮,考虑的情况有3种。如果x‘ >= 100万,则没有必要赌下去的必要;如果50<= x‘< 100万,只要参与赌博并且赌注 >= 50万则有赢的概率为P;如果x‘< 50万,那么无论是否参与最后一轮的赌博,压的赌注是多少赢的概率必为0。

现在考虑一下最后两轮的情况,最后二轮考虑的情况具体可以分为5种。设在倒数第二轮时持有的钱为x‘‘。如果x‘‘>= 100万,赢的概率为1;如果x‘‘< 25万,即便最后两轮赌博都赢了也无济于事,所以赢的概率为0;否则,只要选择参与至少一轮赌博并且赌注至少25万则有获胜概率,具体获胜概率与持有的资金有关。

综上,可以发现,当参与M轮赌博时所需考虑的情况总共有2^m + 1种,某个范围中,即使所持的钱数不同,最后可以带钱回家的概率也是完全一样的。可以通过dp解决。
定义一个二维dp数组,dp[i][j] 表示参与第 i 轮赌博,持有的钱所处阶段为 j (阶段数为0~2^m,共2^m + 1个阶段)并且采取最优策略时赢的概率。
本题是一个 倒推 的过程,初始化:dp[n][1 << m] = 1(即在最后一轮时,处在最后一个阶段,也就是资金已经大于100W)
状态转移方程:
dp[i][j] = max(dp[i][j], P * dp[i + 1][j + k] + (1 - P) * dp[i + 1][j - k] )。
0 <= k <= min(j, n - j)    k是可以增长的阶段数
学到的方法:对于难题找不到入手点的时候,尽可能的选择最简单的情况开始分析,再看稍微复杂一点的,思考是否存在相应的联系,避免一点思绪都没有。

代码:

#include <iostream>
#include <algorithm>
using namespace std;
#define M 1000000
typedef long long ll;
int n;
int m, x;
double p;
double dp[2][1 << 15 + 1];
void slove()
{n = 1 << m; fill(dp[1], dp[1] + n, 0);dp[1][n] = 1.0;for (int k = 0; k < m; k++) //枚举第几轮{for (int i = 0; i <= n; i++) // 枚举所有阶段{double t = 0.0;for (int j = 0;; j++) //可以增长的阶段数{//j是可以增长的阶段数,不能超过当前所处的阶段(此时为全押)if (i + j > n || i - j < 0) break;t = max(t, p*dp[(k + 1) & 1][i + j] + (1 - p)*dp[(k + 1) & 1][i - j]);//运用滚动数组}dp[k & 1][i] = t;}}int ans = (ll)x * n / M; //判断在哪一个范围中//根据m的奇偶性来判断处在哪一个数组中  printf("%.6f\n", dp[(m - 1) & 1][ans]);
}
int main()
{int t;cin >> t;while (t--){cin >> m >> p >> x;slove();}system("pause");return 0;
}

参考博客:
https://blog.csdn.net/liujc_/article/details/47256243

Millionaire(2008 APAC local onsites c) 概率dp相关推荐

  1. Millionaire (2008 APAC local onsites C)

    题目可以在网上找. 很多博文上来就放代码,或者大致说一下思路,让人看着很费解,不理解代码里的变量到底是什么含义. 先把书上的讲解贴上来. 接下来,说明代码中变量的含义. (1)for(int r=0; ...

  2. DP——2008 APAC local onsites C Millionaire

    题目链接: https://codejam.withgoogle.com/codejam/contest/32005/dashboard#s=p2 题意:在一个赌博游戏中,初始有X元,总共玩M轮,每次 ...

  3. Millionaire(2008 APAC local onsites C)(连续 离散化)

    /* 参加赌博,赌 M 次 ,每次都有 P 的概率下注金翻倍 ,(1-P)的概率输掉下注金 每次可以下注任何数量的金币 一开始有金币 x 个,问最后能带1000 000 个以上回家的概率 // 分析: ...

  4. GCJ 2008 APAC local onsites C Millionaire

    /* 非常值得重新重做的概率题,化连续为离散,分为(2^M +1)个区间,double型的赌注,则用该区间内的int型来代替,反正效果一样(最终得到的概率是相等的)等到要输出prv[i]时,再去找在d ...

  5. GCJ2008 APAC local onsites C Millionaire

    自己Blog的第一篇文章,嗯... 接触这道题,是从<挑战程序设计竞赛>这本书看来的,其实头一遍读题解,并没有懂.当然现在已经理解了,想想当初可能是因为考虑两轮的那张概率图的问题.于是决定 ...

  6. Millionaire 2008APAC local onsites C

    /*Millionaire 2008APAC local onsites C 题意:最开始你有X元钱,要进行M轮赌博. 每一轮赢的概率为P,你可以选择赌与不赌, 如果赌也可以将所持的任意一部分钱作为赌 ...

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

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

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

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

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

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

最新文章

  1. SAP PM 初级系列25 - 维修工单与采购单据之间LINK?
  2. oscache.properties文件配置
  3. bzoj 1877: [SDOI2009]晨跑 (网络流)
  4. Vmware7.1.4安装+破解+汉化
  5. matlab读int16读文件_MATLAB——文件读写(1)
  6. Ubuntu14.04部署CEPH
  7. iOS 蓝牙使用小结 bluetooth
  8. 异步方法的编写与使用
  9. 《Linux多线程服务端编程:使用muduo C++网络库》上市半年重印两次,总印数达到了9000册...
  10. 一封来自华尔街 Quant 的信
  11. PHP/PHPStudy所需的VC9-VC14的运行库
  12. 微信小程序数据拼接_微信小程序字符串和变量如何拼接
  13. docker tomcat 多开 实例_Docker 快速验证 tomcat 单机多实例方案
  14. Python爬取中国银行外汇牌价(statsmodels预测分析)--(二)
  15. Windows GetLastError返回值 【转】
  16. SpringCloud微服务使用Feign如何暴露接口并整合SpringBoot测试
  17. opencv之重映射remap
  18. 河南工业大学c语言考试题库,c语言题库(编程)河南工业大学 河工大 c语言期末考试题库...
  19. 传奇开区网站如何添加流量统计代码
  20. 新研究!AI扫描视网膜即可预测心脏病;康奈尔大学『智能系统机器学习』课程;MLOps简化平台;公益活动报名小程序(开源);前沿论文 | ShowMeAI资讯日报

热门文章

  1. linux 用户卸载搜狗输入法一生轻松
  2. pytorch:scatter_
  3. 2022,记录与华为的这场会议
  4. 第6节 寻找主力踪迹——大宗交易数据解读
  5. 有趣的互动投影成为吸引观众的重要手段
  6. Android常见Drawable使用
  7. 数据挖掘 基础知识 收集
  8. imap服务器怎么填写?
  9. Python网页爬虫练习:requests库Beautiful爬取bilibili网页信息
  10. 【高效率python刷Letecode笔记】python刷Letecode小技巧