博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(算法)宝石升级问题
阅读量:7079 次
发布时间:2019-06-28

本文共 1302 字,大约阅读时间需要 4 分钟。

题目:

有一块宝石,1级升2级成功率100%,2级升3级成功率80%,3级升4级成功率60%,4级升5级成功率40%,每次升级失败时降回到1级。请问一块1级宝石升到5级平均要多少次? 

思路:

问题:求一块1级宝石升级到5级的期望次数

1、蒙特卡洛模拟试验

考虑一下期望的定义,所有的可能的次数*出现该次数的概率之和。出现的次数可能为无穷大,但当次数达到一定数量时,期望就收敛了,因此可以通过概率的模拟试验来实现。

2、有限状态机的概率转移思想

假设dp(i,j)为1级升到5级的平均次数,则有以下递推式:

dp(1,5) = 1.0 * dp(2,5) + 0.0 * dp(1,5)+1

dp(2,5) = 0.8 * dp(3,5) + 0.2 * dp(1,5)+1

dp(3,5) = 0.6 * dp(4,5)+ 0.4 * dp(1,5)+1

dp(4,5) = 0.4 * dp(5,5) + 0.6 * dp(1,5)+1

其中dp(5,5)=0;

求解上述方程组,得到dp(1,5)即为答案,答案为17.0833.

代码:

1、蒙特卡洛模拟试验

#include 
#include
#include
#include
using namespace std;bool isUpgrade(double p){ double prob=rand()/(double)(RAND_MAX); if(prob<=p) return true; else return false;}double ExpectedUpgradeTimes(double *P,int n){ const int TIMES=100000000; int grade=0; int times=0; int total=0; double expect=0; for(int i=0;i

2、动态规划

#include 
#include
#include
#include
using namespace std;double ExpectedUpgradeTimes_DP(double *P,int n){ double A[n],B[n]; double p[n]; p[1] = 1.0;p[2] = 0.8;p[3]=0.6;p[4] =0.4; for(int i=4;i>=1;i--){ A[i] = 1+A[i+1]*p[i]; B[i] = p[i]*B[i+1]+1-p[i]; cout<
<<" "<
<

转载地址:http://pspml.baihongyu.com/

你可能感兴趣的文章
awk
查看>>
mysql丢数据
查看>>
java mybatis使用 设置resultType查询对象字段为null
查看>>
【转】mysql对large page的支持
查看>>
centos7 安装java+tomcat
查看>>
HDU 1023 Train Problem II( 大数卡特兰 )
查看>>
【LeetCode每天一题】Group Anagrams(变位词组)
查看>>
【算法导论第13章】红黑树
查看>>
对PostgreSQL中bufmgr.c 中 bufs_to_lap的初步理解
查看>>
Windows 内存分析之路 --How to use Resource Monitor
查看>>
max tablename length limit in MySQL is 64
查看>>
http://daffodil.codeplex.com/
查看>>
ASP.NET中操作SQL数据库
查看>>
windows下,下载pip安装
查看>>
nginx反向代理中proxy_set_header 运维笔记
查看>>
jQuery操作元素的class属性
查看>>
关于idea新建子目录时往父目录名字后叠加而不是树形结构的解决方法(转)
查看>>
HttpURLConnection和HttpClient的区别2(转)
查看>>
第5条:避免创建不必要的对象
查看>>
单元测试利器Mockito框架
查看>>