20. 骰子求和
描述
扔 n 个骰子,向上面的数字之和为 S。给定 n,请列出所有可能的 S 值及其相应的概率。
- 你不需要关心结果的准确性,我们会帮你输出结果。
样例 1:
输入:
n = 1
输出:
[[1, 0.17], [2, 0.17], [3, 0.17], [4, 0.17], [5, 0.17], [6, 0.17]]
解释:
掷一次骰子,向上的数字和可能为1,2,3,4,5,6,出现的概率均为 0.17。
样例 2:
输入:
n = 2
输出:
[[2,0.03],[3,0.06],[4,0.08],[5,0.11],[6,0.14],[7,0.17],[8,0.14],[9,0.11],[10,0.08],[11,0.06],[12,0.03]]
解释:
掷两次骰子,向上的数字和可能在[2,12],出现的概率是不同的。
题解
public class Solution {
/**
* @param n an integer
* @return a list of Map.Entry<sum, probability>
*/
public List<Map.Entry<Integer, Double>> dicesSum(int n) {
// Write your code here
// Ps. new AbstractMap.SimpleEntry<Integer, Double>(sum, pro)
// to create the pair
Map<Integer, Double>[] dp = new Map[n + 1];
Map<Integer, Double> map = new HashMap<>();
map.put(1, 1 / 6.0);
map.put(2, 1 / 6.0);
map.put(3, 1 / 6.0);
map.put(4, 1 / 6.0);
map.put(5, 1 / 6.0);
map.put(6, 1 / 6.0);
dp[1] = map;
for (int i = 2; i <= n; ++i) {
Map<Integer, Double> m = new HashMap<>();
for (Map.Entry<Integer, Double> p : dp[i - 1].entrySet()) {
for (Map.Entry<Integer, Double> c : dp[1].entrySet()) {
int key = p.getKey() + c.getKey();
m.put(key, m.getOrDefault(key, 0.0) + p.getValue() * c.getValue());
}
}
dp[i] = m;
}
List<Map.Entry<Integer, Double>> ret = new ArrayList<>();
for (Map.Entry<Integer, Double> c : dp[n].entrySet()) {
ret.add(c);
}
return ret;
}
}
最后说两句
非常感谢你阅读本文章,如果你觉得本文对你有所帮助,请留下你的足迹,点个赞,留个言,多谢~
作者水平有限,如果文章内容有不准确的地方,请指正。
希望小伙伴们都能每天进步一点点。
声明
本文由二当家的白帽子博客原创,转载请注明来源,谢谢~