剑指 Offer 60-n个骰子的点数C++

题目描述

在这里插入图片描述

解法 dp

  1. dp数组含义
    dp[i][j] 代表i个骰子投出数字j的投法总数,每个骰子的都是特殊的,保证总方法为6的n次方种
  2. dp方程
    dp[i][j] = dp[i - 1][j - k] k<j且 k∈[1,6]
    比如dp[3][8] = dp[2][2]+dp[2][3]…dp[2][7]
    dp[3][3]=dp[2][1] + dp[2][2]
    3.初始值
    dp[1][1] = dp[1][2] = …dp[1][6] = 1
    4.最终结果
    dp[n][n] , dp[n][n + 1] , dp[n][n + 2] … dp[n][6 * n]
class Solution {
    
    
public:
    vector<double> dicesProbability(int n) {
    
    
        //dp[i][j]:i个骰子投出数字为j的结果个数
        //dp[i][j] = dp[i - 1][j-k] k∈[1,6] 
        vector<double> ans(6 * n - n + 1, 0);
        vector<vector<int>> dp(n + 1,vector<int>(6 * n + 1, 0));
        
        for(int k = 1; k <= 6; k++) dp[1][k] = 1;
        
        for(int i = 2; i <= n; i++) {
    
    
            for(int j = i; j <= 6 * i; j++) {
    
    
                for(int k = 1; k <= 6 && k < j; k++) {
    
    
                    dp[i][j] += dp[i - 1][j - k];
                }
            }
        }
        int base = pow(6,n);
        for(int i = n; i <= 6*n ; i ++) ans[i - n] = dp[n][i] * 1.0 /base;
        return ans;
    }
};

在这里插入图片描述
时间复杂度O(N^2)
空间复杂度O(N^2)

猜你喜欢

转载自blog.csdn.net/qq_42883222/article/details/112667931
今日推荐