Sia f(n, a) — il massimo valore possibile della vincita attesa, se il giocatore deve rispondere a domande e la somma iniziale è pari ad .
Se n = 0, il giocatore resta con la somma iniziale, cioè f(0, a) = a.
La probabilità di rispondere correttamente è pari a , dove t \le p \le 1. Se il giocatore risponde correttamente alla prima domanda, gli restano n - 1 domande, e la somma del premio raddoppia diventando . Con probabilità 1 - p viene data una risposta errata, e l'intera somma va perduta. Di conseguenza, la vincita attesa dopo la prima domanda è pari a
Se questo valore supera la somma attuale , allora è conveniente continuare il gioco; altrimenti — bisogna fermarsi. Quindi, la vincita attesa dopo la decisione di continuare è pari a
Poiché la probabilità è distribuita uniformemente sull'intervallo , allora
Se t = 1, allora la probabilità di rispondere correttamente è pari a uno, e in tal caso il giocatore deve rispondere a tutte le domande, ottenendo una vincita finale pari a 2^n.
Esempio
Consideriamo il terzo test, in cui n = 2, t = 0.6. Il capitale iniziale è a = 1.
Calcoliamo il valore di f(1, 2) tramite f(0, 4):
Calcoliamo il valore di f(2, 1) tramite f(1, 2):
Implementazione dell'algoritmo
La funzione integral calcola il valore dell'integrale
per i numeri reali dati e . Quando t = 1, la probabilità di indovinare è pari a uno, quindi il valore dell'integrale I(a, k) viene posto uguale a max(a, k).
Di seguito è mostrata l'area la cui superficie è pari al valore dell'integrale \int_{t}^{1} max(a, kp)\,dp:
Troviamo il punto di intersezione delle rette y = a e y = kp:
Poniamo temp = a / k. Consideriamo il valore dell'integrale \int_{t}^{1} max(a, kp)\,dp come somma di \int_{t}^{temp} a\,dp + \int_{temp}^{1} kp\,dp. A seconda della posizione del punto rispetto ai punti e , calcoliamo il valore dell'integrale I(a, k).
Se t \le temp \le 1, allora \int_{t}^{temp} a\,dp + \int_{temp}^{1} kp\,dp =
Se temp \le t, allora \int_{t}^{temp} a\,dp + \int_{temp}^{1} kp\,dp = \int_{t}^{1} kp\,dp = k \cdot (1 - t \cdot t) / 2.
Se temp > 1, allora \int_{t}^{temp} a\,dp + \int_{temp}^{1} kp\,dp = \int_{t}^{1} a\,dp = a \cdot (1 - t).
double integral(double a, double k)
{
double s = 0, temp = a / k;
if (t == 1) return max(a,k);
if (temp > 1) return a * (1 - t);
if (temp >= t) s = a * (temp - t);
else temp = t;
s += k * (1 – temp * temp) / 2;
return s / (1 - t);
}La funzione f calcola ricorsivamente il valore f(n, a) = \begin{cases} I(a, f(n - 1, 2a)), n > 0 \\ a, n = 0 \end{cases}.
double f(int n, int a)
{
if (!n) return a;
double k = f(n - 1,2 * a);
return integral(a,k);
}Ciclo principale del programma. Leggiamo i dati in ingresso e stampiamo il valore di f(n, 1).
while(scanf("%d %lf",&n,&t),n + t)
printf("%.3lf\n",f(n,1));