某一游戏中有一把武器有1到9个等级,每次升级成功的概率为30%,失败的概率为70%,成功升1级,失败降1级,降到一级不能再降,升到9级不能再升,问1000次内升到9级的概率。
来源:互联网 发布:长沙芙蓉网络花店 编辑:程序博客网 时间:2024/05/15 02:32
这是腾讯官方微博出题,半小时写出程序可当初级程序员:
某一游戏中有一把武器有1到9个等级,每次升级成功的概率为30%,失败的概率为70%,成功升1级,失败降1级,降到一级不能再降,升到9级不能再升,问1000次内升到9级的概率。
这个题目我大概在半个小时的时候写出了数学的函数表达式,因为读懂题目就花了很久。,但是经过仔细思考我已经有了思路,这是一道典型的动态规划的题目。问题的解要综合考虑子问题的解,最开始就是要例举递推公式:
我认为题目出的不严谨,问的是1000次内升到9级的概率,而我之前理解成打完1000次之后,是9级的概率。其实不论怎么理解,最后的动态规划公式都只需要作小小的改动,但是这告诉了我们读懂题目的重要性。题目的意思就是打到第i次,升到9级就OK了,至于之后的,到底是继续降阿,还是保持9级不动,就不归我们管了,只要升到9级就OK了。所以我希望题目加一句话,就是升到9级后游戏结束!!!这就多好理解阿,另外,因为是1000次以内,所以要累积这所有的1000次,每次升到9级的概率,当然, 玩了7次后,游戏最多升到了8级,所以至少需要8次,才能升到9级。
首先我要假设一进入游戏就是1级,打了一次游戏之后,0.7的概率还是一级,0.3的概率是玩家升到了2级。
令f(n,m)表示第n次玩游戏结束时,级数为m的概率,则
f(1,1)=0.7; f(1,2)=0.3; f(1,3)=0;....;f(1,9)=0;
f(2,1)= f(1,1)*0.7 + f(1,2) *0.7 = 0.7;
f(2,2)=f(1,1)*0.3 + f(1,3) * 0.7 = 0.21 +0 = 0.21
f(2,3)=f(1,2)*0.3 + f(1,4)*0.7 = 0.09 +0 = 0.09; f(2,4).....f(2,9)=0 ; f(2,1)+f(2,2)+f(2,3)=1 正确!
讨论f(n,m)的一般性动态规划公式:
m==1时: f(n,m)=f(n,1)= f(n-1,1)*0.7 + f(n-1,2)*0.7
m>1 && m<8 时: f(n,m) = f(n-1,m-1) * 0.3 + f(n-1,m+1) * 0.7
m==8时: f(n,m) = f(n,8) = f(n-1,7)*0.3 (注意:m=8时,只考虑前一次升到7级的情况,因为升到9级后就结束了)
m==9时: f(n,m)= f(n,9) = f(n-1,8)*0.3
最终结果就是 f(1,9)+ f(2,9) + f(3,9) + .... + f(999,9) + f(1000,9)
#include<iostream>using namespace std;int main(){ double a[1001][10]; int i,j; for(i=0; i<1001; i++) a[i][0]=0; for(j=0; j<10; j++) a[0][j] = 0; for(i=1; i<9; i++) for(j=1; j<10; j++) a[i][j] = 0; a[1][1]=0.7; a[1][2]=0.3; for(i=2; i<=1000; i++) { for(j=1; j<=9; j++) { if(j==1) a[i][j] = a[i-1][j]*0.7 + a[i-1][j+1]*0.7; else if( j>1 && j<8) a[i][j] = a[i-1][j-1]*0.3 + a[i-1][j+1]*0.7; else if(j==8) a[i][j] = a[i-1][j-1]*0.3; else if(j==9) a[i][j] = a[i-1][j-1]*0.3; } } double sum=0; for(i=7; i<1001; i++) { sum += a[i][9]; } cout <<" sum is " << sum <<endl; return 1;}
- 某一游戏中有一把武器有1到9个等级,每次升级成功的概率为30%,失败的概率为70%,成功升1级,失败降1级,降到一级不能再降,升到9级不能再升,问1000次内升到9级的概率。
- 某网游 从1级升到2级 成功的概率是80% 从2级升到3级的概率是80% 问
- 数理统计——有1,2,3,......无穷个格子,你从1号格子出发,每次1/2概率向前跳一格,1/2概率向前跳两格,走到格子编号为4的倍数时结束,结束时期望走的步数为
- 假设一段公路上,1小时内有汽车经过的概率为96%,那么,30分钟内有汽车经过的概率为
- 当今社会,非名校寒门大学生成功的概率有多大?
- 【POJ3744】【概率DP 分块思想】 Scout YYF I 走一步概率p,走两步概率1-p,之间有n个雷,求安全通过的概率
- 用多少个宝石可以让一把1级的宝剑升到9级
- 概率为0的事件,必然不能发生吗?
- 赌徒有10元,一次输赢1元,手头能到110元的概率
- 蛙跳到第N个台阶的概率,一次以p的概率跳1个台阶,(1-p)的概率跳2个台阶
- /有一个函数fun能返回0和1两个值,返回0和1的概率都是1/2,问怎么利用这个函数得到另一个函数fun2,使fun2也只能返回0和1,且返回0的概率为1/4,返回1的概率为3/4
- 概率和为1
- 从0到n-1中随机等概率输出m个不重复的数
- 从0到n-1中随机等概率输出m个不重复的数
- 给定一个函数rand()能产生0到n-1之间的等概率随机数,问如何产生0到m-1之间等概率的随机数?
- 给定一个函数rand()能产生0到n-1之间的等概率随机数,问如何产生0到m-1之间等概率的随机数?
- 给定一个函数rand()能产生0到n-1之间的等概率随机数,问如何产生0到m-1之间等概率的随机数?
- 面试失败:求职成功的一把“金钥匙”
- 敏捷团队管理:把握介入团队的程度
- poj1459 网络流经典
- OAuth授权机制
- Linux系统新手学习的11点建议
- 2012—07—03 星期二
- 某一游戏中有一把武器有1到9个等级,每次升级成功的概率为30%,失败的概率为70%,成功升1级,失败降1级,降到一级不能再降,升到9级不能再升,问1000次内升到9级的概率。
- each实质上是一个for循环,那么能不能像普通的for循环那样break和continue呢?
- linux文件的三种时间属性
- 互斥量(mutex)
- Java开发快捷键介绍
- 二叉树的遍历(递归和非递归)
- poj 1273Drainage Ditches 最大流
- cygwin daemon
- Get 与 Post 的区别