某一游戏中有一把武器有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;}





 

原创粉丝点击