【精】LintCode领扣算法问题答案:20. 骰子求和

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;
    }
}

最后说两句

非常感谢你阅读本文章,如果你觉得本文对你有所帮助,请留下你的足迹,点个赞,留个言,多谢~

作者水平有限,如果文章内容有不准确的地方,请指正。

希望小伙伴们都能每天进步一点点。

声明

本文由二当家的白帽子博客原创,转载请注明来源,谢谢~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二当家的白帽子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值