剑指offer——60. n 个骰子的点数

60. n 个骰子的点数

题目链接

Lintcode

题目描述

把 n 个骰子扔在地上,求点数和为 s 的概率。


解题思路

动态规划

使用一个二维数组 dp 存储点数出现的次数,其中 dp[i][j] 表示前 i 个骰子产生点数 j 的次数。

空间复杂度:O(N2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:
vector<int> numberOfDice(int n) {
vector<int>dp(6*n+1, 0);
for(int i = 1;i<=6;i++)//动归数组初始值,表示1个骰子扔出1-6的可能数都为1
dp[i] = 1;
for(int i = 2;i<=n;i++){
for(int j = 6*i;j>=0;j--){
dp[j] = 0;
for(int k = 6;k>=1;k--){//最后一个骰子可以扔1-6点
if(j-k<0)
continue;
dp[j] += dp[j-k];
}
}
}
vector<int>res(dp.begin()+n, dp.end());//扔n个骰子的和为[n, 6*n]
return res;
}
};
创作不易,欢迎打赏!
-------------本文结束感谢您的阅读-------------