(算法)宝石升级问题
2015-08-24 17:33
369 查看
题目:
有一块宝石,1级升2级成功率100%,2级升3级成功率80%,3级升4级成功率60%,4级升5级成功率40%,每次升级失败时降回到1级。请问一块1级宝石升到5级平均要多少次?思路:
问题:求一块1级宝石升级到5级的期望次数1、蒙特卡洛模拟试验
考虑一下期望的定义,所有的可能的次数*出现该次数的概率之和。出现的次数可能为无穷大,但当次数达到一定数量时,期望就收敛了,因此可以通过概率的模拟试验来实现。
2、[b]有限状态机的概率转移思想[/b]
假设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 <iostream> #include <time.h> #include <stdlib.h> #include <iomanip> 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<TIMES;i++){ grade=0; times=0; while(grade!=n-1){ if(isUpgrade(P[grade])) grade++; else grade=0; times++; } total+=times; } expect=(double)total/TIMES; return expect; } int main(){ srand((unsigned int)time(NULL)); double P[]={1.0,0.8,0.6,0.4}; int len=sizeof(P)/sizeof(P[0]); double exp=ExpectedUpgradeTimes(P,len+1); cout<<fixed<<exp<<endl; cout << setprecision(2) << exp << endl; return 0; }
2、动态规划
#include <iostream> #include <time.h> #include <stdlib.h> #include <iomanip> using namespace std; double ExpectedUpgradeTimes_DP(double *P,int n){ double A ,B ; double p ; 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<<A[i]<<" "<<B[i]<<endl; } double t = A[1]/(1-B[1]); return t; } int main(){ srand((unsigned int)time(NULL)); double P[]={1.0,0.8,0.6,0.4}; int len=sizeof(P)/sizeof(P[0]); double exp=ExpectedUpgradeTimes_DP(P,len+1); cout<<fixed<<exp<<endl; cout << setprecision(2) << exp << endl; return 0; }
相关文章推荐
- POJ_3468 A Simple Problem with Integers(线段树+lazy标记)
- 每天进步一点点————MySQL锁
- PXE kickstart 批量部署 centOS6.5
- Mybatis——<selectKey>生成主键/获取插入数据主键
- Maven 手动添加 JAR 包到本地仓库
- 更新日志 - BugHD 与你的应用一起成长
- ****JFinal 部署在 Tomcat 下推荐方法
- 一次性搞定Session
- jQuery实现TAB风格的全国省份城市滑动切换效果代码
- 实例渲染Instanced Rendering
- 数据库SQL Server2012笔记(五)——维护数据的完整性——约束
- mocha-casperjs 环境搭建
- PHP单例模式例子
- Makefile容易犯错的语法
- 从C++到COM,学习笔记(7)
- 变态跳台阶-一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
- linux移植简介[MS2]
- Quartz2d从易到难全解析---利用位图上下文打水印,并保存图片
- testlink与jira整合方法
- CSDN-markdown语法之如何使用LaTeX语法编写数学公式