【题目描述】
DFS
【思路】
DFS 搜索统计每一种可能。
时间复杂度: O(6 ^n)
class Solution {
int n;
int [] cnt;
//投了m次 和为sum
public void dfs(int m,int sum){
if( m == n){
cnt[sum]++;
return;
}
for(int i = 1; i <= 6; i ++)
dfs(m + 1, sum + i);
}
public int[] numberOfDice(int _n) {
n = _n;
cnt = new int[6*n + 1];
dfs(0, 0);
int a[] = new int[5*n + 1];
int index = 0;
for(int i = 0; i < cnt.length; i ++)
if( cnt[i] > 0)
a[index++] = cnt[i];
return a;
}
}
TLE 代码
9/10
class Solution {
//投掷n次 和为sum的方案数
public int dfs(int n, int sum){
if( sum < n) return 0;
if( n == 0) return sum == 0 ? 1 : 0;
int ans = 0;
for(int i = 1; i <= 6; i++)
ans += dfs(n - 1, sum - i);
return ans;
}
public int[] numberOfDice(int n) {
int res[] = new int [5*n + 1];
int index = 0;
for(int i = n; i <= 6 * n; i++) res[index++] = dfs(n, i);
return res;
}
}
动态规划
【思路】
class Solution {
public int[] numberOfDice(int n) {
//状态数组f(投掷次数,点数和)
//次数范围为[0~n], 点数和范围为[n ~ 6 *n]
int [][] f = new int[n + 1][6 * n + 1];
//投掷0次 点数和为0的方案数为1
f[0][0] = 1;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= 6 * n; j ++)
for(int k = 1; k <= Math.min(j, 6); k ++)
f[i][j] += f[i - 1][j - k];
int res[] = new int[5 * n + 1];
int index = 0;
for(int i = n; i <= 6 * n; i ++)
res[index ++] = f[n][i];//投掷n次 和为i的方案数
return res;
}
}