UVALive 6624 - Card Trick - 概率dp

題意:有很多張牌,當翻開一張數值是x,那就再翻這張牌後面的第x張,直到翻到一張他後面的第x張不存在,給出一個人翻牌的起始位置,翻的n張牌,問第二個人從前十張任意一張開始翻,結束位置和第一個人相同的概率。J,Q,K的值都是10,A是11。

比較水的概率dp,只是一開始沒讀懂題……從前十個位置開始,那麼就是前十個位置的概率初始值爲0.1,其餘爲0,如果第一個人翻開了的位置,那麼數字就是確定的了,一定會轉移到下一個固定位置,就是第一個翻開的下一個位置,對於其他位置會有4/13的可能前進10步其餘可能各1/13。最後輸出第一個dp[m],m是第一個翻開的最後一張牌的位置。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
double dp[2000];
int id[2000];
char s[10];
int main() {
    int n, m, mx, a, i, j;
    while(~scanf("%d%d", &n, &m)) {
        memset(dp, 0, sizeof(dp));
        memset(id, 0, sizeof(id));
        for(i = 0; i < n; i++) {
            scanf("%s", s);
            if(s[1] != 0 || s[0] > 'A')
                a = 10;
            else if(s[0] == 'A')
                a = 11;
            else a = s[0] - '0';
            id[m] = a;
            m += a;
        }
        m -= a;
        for(i = 1; i < 11; i++)
            dp[i] = 0.1;
        for(i = 1; i < m; i++) {
            if(id[i] != 0) {
                dp[i + id[i]] += dp[i];
                continue;
            }
            for(j = 2; j < 12; j++) {
                if(j == 10)
                    dp[i + j] += dp[i] * 4.0 / 13;
                else dp[i + j] += dp[i] * 1.0 / 13;
            }
        }
        printf("%.15lf\n", dp[m]);
    }
    return 0;
}



發佈了67 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章