首页 > 代码库 > 概率DP

概率DP

看起来,DP是很简单的。但概率DP就是加了一个概率。

仅仅是一个概率,就让我不知如何计算。

看了巨犇的代码,应该是勉强理解。

http://www.cnblogs.com/767355675hutaishi/p/4373954.html

但概率学就是有些困难。

题目大致是这样:

你有X元钱,进行M轮赌博游戏。每一轮可以将所持的任意一部分钱作为赌注(赌注为0元表示这一轮不押),赌注可以是小数的,不是一定要整数。每一轮 赢的概率为P,赢了赌注翻倍,输了赌注就没了。如果你最后持有至少1000000元钱的话,就可以把钱全部带走。要求计算在采取最优策略时,获得至少 1000000元钱的概率。

其实可以看一下,如果全都赢,钱还没达到1000000,就可以直接0.

概率计算有些麻烦,但考试也会考到,就只能看一看。

代码不是我亲手敲的。

#include<bits/stdc++.h>
#include <iostream>
#include <memory.h>
#include <algorithm>
#include <cstdio>
using namespace std;

int M , X;  
double P;  
double dp[2][(1 << 15) + 1]; 

void solve()  
{  
    int n=1<<M;
    double *pre=dp[0],*nxt=dp[1];
    memset(pre,0,sizeof(double)*(n+1));
    pre[n]=1.0;
    for(int r=0;r<M;r++)  
     { 
        for(int i = 0 ; i <= n ; i++)   
        {  
            int step = min(i , n - i);
            double t = 0.0; 
            for(int j = 0 ; j <= step ; j++)      
            t = max(t , P * pre[i + j] + (1 - P) * pre[i - j]);
            nxt[i] = t;
            }  
            swap(pre , nxt);  
            }  
            int i = X * n / 1000000;
            printf("%.6lf\n" , pre[i]);  
} 

int main()
{
    cin >> M >> P >> X;
    solve();
    return 0;
}

 

概率DP