【解题思路】
首先想到用深搜穷举所有可能的组合,然后计算每个点数出现的概率。(我好喜欢用深搜,然而好几次深搜只能通过部分测试样例,要动态规划才能完全解决问题)
class Solution {
Map<Integer, Integer> map = new HashMap<>();
int[] arr = {1,2,3,4,5,6};
public double[] dicesProbability(int n) {
search(n, 0, 0);
int len = map.size();
Object[] keys = map.keySet().toArray();
Arrays.sort(keys);
double[] ans = new double[len];
int count = 0;
for(Integer tmp : map.values())
{
count += tmp;
}
for(int i = 0; i < len; i++)
{
ans[i] = (double)map.get(keys[i])/count;
}
return ans;
}
public void search(int n, int m, int sum)
{
if(m == n)
{
int cnt = map.getOrDefault(sum, 0) + 1;
map.put(sum, cnt);
}
else
{
for(int i = 0; i < 6; i++)
{
search(n, m+1, sum+arr[i]);
}
}
}
}
然后,最后一个测试样例过不了……
class Solution {
public double[] dicesProbability(int n) {
double[] dp = new double[6];
Arrays.fill(dp, 1.0 / 6.0);
for (int i = 2; i <= n; i++) {
double[] tmp = new double[5 * i + 1];
for (int j = 0; j < dp.length; j++) {
for (int k = 0; k < 6; k++) {
tmp[j + k] += dp[j] / 6.0;
}
}
dp = tmp;
}
return dp;
}
}