玩一个游戏,一开始有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; }