LeetCode837.新21點

問題描述:

愛麗絲參與一個大致基於紙牌遊戲 “21點” 規則的遊戲,描述如下:

愛麗絲以 0 分開始,並在她的得分少於 K 分時抽取數字。 抽取時,她從 [1, W] 的範圍中隨機獲得一個整數作爲分數進行累計,其中 W 是整數。 每次抽取都是獨立的,其結果具有相同的概率。

當愛麗絲獲得不少於 K 分時,她就停止抽取數字。 愛麗絲的分數不超過 N 的概率是多少?

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/new-21-game

示例 1:

輸入:N = 10, K = 1, W = 10
輸出:1.00000
說明:愛麗絲得到一張卡,然後停止。

示例 2:

輸入:N = 6, K = 1, W = 10
輸出:0.60000
說明:愛麗絲得到一張卡,然後停止。
在 W = 10 的 6 種可能下,她的得分不超過 N = 6 分。

示例 3:

輸入:N = 21, K = 17, W = 10
輸出:0.73278

解題思路:

以 n=21,k=17,w=3爲例講解:
dp[i]表示的是當總共分數爲i時的概率爲dp[i],

所以最終的解是dp[17]+dp[18]+dp[19]+dp[20]+dp[21],那麼dp[21]可以如何求得呢
dp[21]可能是18+3,19+2,20+1轉移求得的,

所以dp[21]的概率爲之前去的18,19,20概率之和乘上1/w(1/w表示的是w個數取得其中一個),

公式就是\small dp[21]=dp[20]*1/w+dp[19]*1/w+dp[18]*1/w=1/w(dp[18]+dp[19]+dp[20])

完整代碼如下:

class Solution {
public:
    double new21Game(int N, int K, int W) {
        if(K==0) return 1.0;
        if(N==0 || K>N) return 0;
        vector<double> dp(N+1,0.0);
        double sum = 1.0;
        double res = 0.0;
        dp[0] = 1.0;
        for(int i=1;i<=N;i++){
            dp[i] = 1.0*sum/W;
            if(i<K) sum+=dp[i];
            else res+=dp[i];//符合要求 K<=i<=N
            if(i>=W) sum-=dp[i-W];//sum只能容納W個
        }
        return res;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章