题目描述
解法 dp
- dp数组含义
dp[i][j] 代表i个骰子投出数字j的投法总数,每个骰子的都是特殊的,保证总方法为6的n次方种 - 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)