某一游戏中有一把武器有1到9个等级,每次升级成功的概率为30%,失败的概率为70%,成功升1级,失败降1级,降到一级不能再降,升到9级不能再升,问1000次内升到9级的概率。
2012-07-07 11:23
274 查看
这是腾讯官方微博出题,半小时写出程序可当初级程序员:
某一游戏中有一把武器有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)
某一游戏中有一把武器有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; }
相关文章推荐
- 一切成功源于积累——20140405 为什么就是不能再等等 每次都会被杀200点以上
- Linux下Eclipse配置安装 PyDev(Pydev插件一直不能成功,安装这个插件失败的问题)
- 为什么制作差分包时未使用-k 选项有时可以升级成功、有时却失败?
- CPC客户端离线升级失败,不能获取updatesipo信息,可能你的软件在线更新程序没有安装
- ###(很难找的页面错误)查询操作不需要 返回 操作成功后失败。【方法不能同时执行两个response返回两次数据。导致页面显示数据失败】
- QQ游戏,打开XX客户端失败,如果由于此问题而不能进行游戏,请尝试重新安装该游戏
- win10易升升级失败,提示正在还原以前版本的windows,反复重启不能进入系统
- Linux下Eclipse配置安装 PyDev(Pydev插件一直不能成功,安装这个插件失败的问题)
- 为什么编译不能成功,每次还得我重新打开编译器
- 面试失败:求职成功的一把“金钥匙”
- 某网游 从1级升到2级 成功的概率是80% 从2级升到3级的概率是80% 问
- mac安装pandas失败和不能卸载升级numpy的解决方法
- 解决android系统进行OTA升级失败时进入recovery界面不能自动重启问题
- 不能及时成功就是失败
- 我不会一直失败就像我不能一直成功一样!希望编程留给我的一直都是感动!
- android studio 升级2.3.2或2.3.3打包项目时signature versions v2打包成功,安装失败问题解决
- 如果你有想要做的事而别人告诉你说“很难,不能,你办不到的”。千万千万别相信他,因为他不是你,他不会为你承受你成功或失败的结局
- 面试中的概率问题 - 数学期望(2) - 武器升级需要的宝石数
- 12306火车票订票失败!您的身份信息未经核验,一般人是不能订票的,我订了,但是没成功。。。
- 我的VS2005采用的是web开发设置。不知道动到了那里,现在每次按F5启动调试的时候总是不能成功启动调试。效果和按CTRL+F5一样。就是把项目显示在了浏览器之后,那个启动调试的绿色按钮还可以使用,不是暗色的。