剑指offer_n 个骰子的点数
题目描述
把 n 个骰子仍在地上,求点数和为 s 的概率。

使用一个二维数组 dp 存储点数出现的次数,其中 dp[i][j] 表示前 i 个骰子产生点数 j 的次数。 空间复杂度:O(N2 )
1 public List<Map.Entry<Integer, Double>> dicesSum(int n) { 2 final int face = 6; 3 final int pointNum = face * n; 4 long[][] dp = new long[n + 1][pointNum + 1]; 5 for (int i = 1; i <= face; i++) 6 dp[1][i] = 1; 7 for (int i = 2; i <= n; i++) 8 for (int j = i; j <= pointNum; j++) 9 /* 使用 i 个骰子最小点数为 i */ 10 for (int k = 1; k <= face && k <= j; k++) 11 dp[i][j] += dp[i - 1][j - k]; 12 13 14 final double totalNum = Math.pow(6, n); 15 List<Map.Entry<Integer, Double>> ret = new ArrayList<>(); 16 for (int i = n; i <= pointNum; i++) 17 ret.add(new AbstractMap.SimpleEntry<>(i, dp[n][i] / totalNum)); 18 return ret; 19 }

浙公网安备 33010602011771号