---restore content starts---
Test instructions: At first you have x dollars, you want to carry on M-rounds of gambling. The probability of each round of win is p, you can choose to bet and not bet, if you bet can also be held any part of the money as a bet (can be an integer, it can be a decimal). If you win, you'll double the bet, and you'll lose the bet. At the end of M-wheel gambling, if you hold more than $1 million, you can take the money home. Q: When you take the optimal strategy, you get more than 1 million yuan of money and take home the probability of how much.
Genre: Dynamic Planning & discretization Ideas
Analysis: Because each round of bets is arbitrary, not necessarily an integer, so there is an infinite number of possibilities, so even if you want to exhaustion search can not start. But if it can be dispersed continuously, then it may be limited. The following: Assuming that before the M-1 round of gambling, still hold X ' Yuan. For the final round, there are 3 things to consider. If X ' >= 1 million, then there is no need to bet the probability of the last round of 0, if 50<= x ' < 1 million, as long as the participation in gambling and bet >= 500,000 is the probability of winning p; if X ' < 500,000, then whether or not to participate in the last round of gambling, The probability of winning a bet is 0. We might as well take a look at the relationship between the penultimate and the last round, with the money held at X in the penultimate round. If x >= 1 million, the probability of winning is 1; if x < 250,000, even if the last two rounds of gambling win the total amount of money will be less than 1 million, so the probability of winning is 0; otherwise, just choose to participate in at least one round of gambling and bet at least 250,000 has the probability of winning. Assuming that the second-to-last bet is y (y = 0 or y >= 250,000), the final round holds the money x ' = (x + y) or x ' = (XY). And the second-to-last consideration of the situation can be divided into 5 kinds. In conclusion, when participating in M-wheel gambling, there are a total of 2^m + 1, which can be solved by DP. Define a two-dimensional DP array, Dp[i][j]: = Participate in the first round of gambling, holding the money in the module is J and take the optimal strategy when the probability of winning. Initialize: dp[n][1 << m] = 1, state transition equation Dp[i][j] = max (P * dp[i + 1][j + K] + (1-p) * dp[i + 1][j-k]/0 <= k <= min (j , N-j)). Time complexity O (m*2^2m).
Code implementation: The optimization of spatial complexity has been completed by using a rolling array loop
#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;//: module n corresponds to the funds >= 1 million
for (int r = 0; r < M; r++)
{
for (int i = 0; I <= N; i++)
{
int step = min (i, n-i);//Avoid i + J > N
Double T = 0.0;
for (int j = 0; J <= Step; j + +)
t = max (t, P * pre[i + j] + (1-p) * pre[i-j]);//M-wheel gambling, minimum gambling should be 1 million/n
Nxt[i] = t;//with the funds of module I for R + 1 rounds of gambling, the maximum probability of winning
}
Swap (pre, NXT);
}
int i = x * n/1000000;//Capital x module
printf ("%.6lf\n", Pre[i]);
}
int main ()
{
CIN >> M >> P >> X;
Solve ();
return 0;
}
---restore content ends---
Millionaire (APAC local onsites c)