题目链接:
https://codejam.withgoogle.com/codejam/contest/32005/dashboard#s=p2题意:在一个赌博游戏中,初始有X元,总共玩M轮,每次你可以下一定赌注,有概率P赢:赌注翻倍;输:赌注就没了。求在M轮后总金额达到1000000以上的概率。(假设采取最优策略)
分析:经分析,我们发现如果只有一轮的话,根据初始赌注的不同,最后达到目的的概率为 [0~50000]: 0, [500000~1000000]: P, [1000000~﹢∞): 1。即只需找出分界点的概率。在计算的时候,我们则假设一个赌注然后取 max(p[i−x]∗(1−P)+p[i+x]∗P) 。然后我们发现这个分界点的数目为 2M+1 ,然后搜索每个点的概率即可
DP:
void solve(int t)
{
int n = 1<<M;
double *prv = dp[0], *nxt = dp[1];
memset(prv, 0, sizeof(double)*(n+1));
prv[n] = 1.0;
for(int i=0;i<M;i++)
{
for(int j=0;j<=n;j++)
{
int gap = min(j, n-j);
double cnt = 0.0;
for(int k=0;k<=gap;k++)
{
cnt = max(cnt, (1-P)*prv[j-k]+(P)*prv[j+k]);
}
nxt[j] = cnt;
}
swap(prv,nxt);
}
int index = (LL)X*n/1000000;
printf("Case #%d: %.6lf\n", t, prv[index]);
}