劍指 offer 第二版:n 個骰子的點數

題目鏈接:https://leetcode-cn.com/problems/nge-tou-zi-de-dian-shu-lcof

思路:

首先可以確定,暴力很難過這個題。

我們假設:對於某點數 x,這 n 個骰子可以有 y 種方案數來形成。

那麼每種 x 點數的出現概率其實是:y(1/6)ny * (1/6)^n

所以我們要做的就是計算出每種點數的 y。

我們可以用 dp 來解決這個問題

dp[i][j]dp[i][j] 表示使用 ii 個骰子,形成點數和爲 jj 的方案數

那麼狀態轉移方程:dp[i][j]+=dp[i1][j]+dp[i1][jw[k]]dp[i][j] += dp[i - 1][j] + dp[i - 1][j - w[k]],其中 w[k]w[k] 就是點數,顯然是 1 ~ 6.

但是我們知道,骰子是沒有點數 0 的,

所以上狀態轉移方程就變成了 dp[i][j]+=dp[i1][jw[k]]dp[i][j] += dp[i - 1][j - w[k]]

Code:

class Solution {
public:
    vector<double> twoSum(int n) {
        double base = 1.000;
        for(int i = 1;i <= n;++ i) base *= 1.0 / 6;
        memset(dp,0,sizeof(dp));
        dp[0][0] = 1;
        for(int i = 1;i <= n;++ i) {
            for(int j = 1;j <= 6 * n;++ j) {
                for(int k = 1;k <= 6;++ k) {
                    if(j >= k) dp[i][j] += dp[i - 1][j - k];
                }
            }
        }
        vector<double> v;
        for(int i = n;i <= 6 * n;++ i) {
            v.push_back(dp[n][i] * base);
        }
        return v;
    }
    int dp[15][110];
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章