UVA 11427 Expect the Expected (概率dp+推公式求期望 詳解)

_TCgogogo_發表於2015-08-25

題目連結:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2422


題目大意:一個人每天玩遊戲,玩一局勝利的概率為p,一天最多玩n次,如果當天某時刻勝率大於p則結束,第二天繼續玩,如果某天玩了n次勝率還是不大於p,則失敗不再玩,求玩的天數的期望


題目分析:先求一天失敗的概率q,設dp[i][j]為一天內玩了i局勝j局的概率,則q=∑dp[n][i] (i / n <= a / b),下面是dp方程:

dp[i][0] = dp[i - 1][0] * (1- p),  一局都沒勝利

dp[i][j] = dp[i - 1][j] * (1-  p),第i局輸了

dp[i][j] = dp[i - 1][j - 1] * p,(a * i >= b * j),第i局勝了,這裡一定要注意,前提是勝率不能大於p,否則當天就算勝利了

因為每天玩的情況都是獨立的,最後答案E = 1 * q + 2 * q * (1 - q) + 3 * q * (1- q)^2 + ... + n * q * (1 - q)^(n - 1)  (n -> ∞)

E/q = 1 + 2 * (1 - q) + 3 * (1 - q)^2 + ... + n * (1 - q)^(n - 1)     ......(1)

E/q * (1 - q) = (1 - q) + 2 * (1 - q)^2 + 3 * (1 - q)^3 + ... + n * (1 - q)^n    ......(2)

(1) - (2) = E = 1 + (1 - q) + (1 - q)^2 + (1 - q)^3 + ... + (1 - q)^(n - 1) - n * (1 - q)^n

好多部落格寫的都不對,雖然不影響答案,等比數列求完後面還有一項,所以最後

E = 1 / q - (1 - q)^n / q - n * (1 - q)^n,顯然(1 - q)^n / q這個在n趨向於無窮大的時候是0,至於n*(1-q)^n,令x=1-q,則0 < x < 1,令k = 1 / x,則k > 1,原式等於n / (k ^ n),然後洛必達法則,得到它的極限為0,其實你也可以說指數增長的肯定比線性快,但是這樣證更清晰吧,所以最後得到E = 1 / q,如此簡單的式子。。。orz

#include <cstdio>
#include <cstring>
int const MAX = 105;
double dp[MAX][MAX];

int main()
{
    int T;
    scanf("%d", &T);
    for(int ca = 1; ca <= T; ca++)
    {
        memset(dp, 0, sizeof(dp));
        int a, b, n;
        scanf("%d/%d %d", &a, &b, &n);
        double p = (double)a / (double)b;
        dp[0][0] = 1.0;
        for(int i = 1; i <= n; i++)
        {
            dp[i][0] = dp[i - 1][0] * (1.0 - p);
            for(int j = 1; j <= n; j++)
            {
                dp[i][j] += dp[i - 1][j] * (1.0 - p);
                if(a * i >= b * j)
                    dp[i][j] += dp[i - 1][j - 1] * p;
            }
        }
        double ans = 0;
        for(int i = 0; i <= n; i++)
            ans += dp[n][i];
        printf("Case #%d: %d\n", ca, (int) (1.0 / ans));
    }
}



相關文章