例题-Millionaire-数学+动态规划

玩一个游戏,一开始有X元,共M轮赌博。每轮可以将任意部分的前当做赌注(小数也可以)。每一轮都有概率P会赢,赢了赌注就翻倍,输了赌注就没了。如果最终持有100000元以上就算赢了。求当采取最优策略时,起始有X元时,赢的概率是多少?

首先要从M-1轮开始前开始推理,有三档可能,[0,50000)时即使翻倍也是输。[50000,100000)时有P的概率会赢。[100000,...)有1的概率会赢。所以可以分为三种可能。然后对第i轮开始前进行递推,每轮可能的档次有2^(m-i)+1档。于是将档次和轮次作为状态得到:

f(t,s) :第t轮,有s的钱。今后赢的概率有多少。

枚举所有今次拿来赌博的钱即可。

#define MAX_N 1<<15
int M,X;
double P;
int n;
int main(){
    M=3;
    P=0.75;
    X=60000;
    n=1<<M;
    vector<vector<double> >dp(2,vector<double>(n+1,0));
    //the highest level should be >= 10k,in which case it is 1.
    dp[1][n]=1;
    for(int t=M-1;t>=0;t--) {    //for every previous turn
        int cur=t%2;
        int prev=(t+1)%2;
        for(int j=0;j<=n;j++) {
            dp[cur][j]=0;
            double cp=0;
            for(int k=0;k<=j;k++){
                cp=max(cp,dp[prev][min(j+k,n)]*P+dp[prev][j-k]*(1-P));
            }
            dp[cur][j]=cp;
        }
    }
    int deg=(double(X)/100000.0)*n;
    cout<<dp[0][deg]<<endl;
    return 0;
}

 

posted @ 2014-10-21 17:14  zombies  阅读(375)  评论(0编辑  收藏  举报