Skip to content

Latest commit

 

History

History
49 lines (43 loc) · 1.23 KB

README.md

File metadata and controls

49 lines (43 loc) · 1.23 KB

题目描述

把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。

你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。

dp动态规划

定义状态:dp[i][j]表示掷第i枚骰子获得点数为j的次数

状态转移方程:

for (第n枚骰子的点数 i = 1; i <= 6; i ++) {
    dp[n][j] += dp[n-1][j - i]
}

初始化状态:

for (int i = 1; i <= 6; i ++) {
    dp[1][i] = 1;
}
class Solution {
public:
    vector<double> twoSum(int n) {
        vector<double> res;
        vector<vector<int>> dp(n+1, vector<int>(6*n+1,0));
        for (int i = 1; i <= 6; i++) {
            dp[1][i] = 1;
        }
        for (int i = 2; i <= n; i++) {
            for (int j = i; j <= 6 * i; j++) {
                for (int k = 1; k <= 6; k++) {
                    if (j > k) {
                        dp[i][j] += dp[i-1][j-k];
                    }
                }
            }
        }
        double base = pow(6, n) * 1.0;
        for (int i = n; i <= 6 * n; i++) {
            res.push_back(dp[n][i] / base);
        }
        return res;
    }
};