本文主要是介绍剑指 Offer 60. n个骰子的点数(*****),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、题目:
把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。
你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。
二、思路和代码:
DP:使用上一次的结果推出下一次的,而第一次的朝上一面的点数之和出现的概率是很清晰的,都是它本身1次/6种;
第一个骰子(初始化结果):
第二个:
第三个:
等等等等
第n个:
据此代码:
class Solution {
public:vector<double> dicesProbability(int n) {//只有一个骰子的情况vector<double> dp(6, 1.0 / 6.0);//从第二个到第n个for (int i = 2; i <= n; i++) {//n个骰子的和在n-6n之间,共有5n+1种vector<double> tmp(5 * i + 1, 0);for (int j = 0; j < dp.size(); j++) {for (int k = 0; k < 6; k++) {//每多一个骰子,骰子和种类就是原来的6倍,之前每种和只会影响它+1+2+3+4+5+6这里几种情况。tmp[j + k] += dp[j] / 6.0;}}//使用上一次的结果来搞下一次的,动态规划dp = tmp;//C++不能数组直接赋值,但是std::array和std::vector是可以的.}return dp;}
};
结果:
PS:思路借鉴来源:Krahets:剑指 Offer 60. n 个骰子的点数(动态规划,清晰图解)
怕什么真理无穷,进一步有进一步的欢喜!
这篇关于剑指 Offer 60. n个骰子的点数(*****)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!