前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >剑指Offer - 面试题60. n个骰子的点数(动态规划)

剑指Offer - 面试题60. n个骰子的点数(动态规划)

作者头像
Michael阿明
发布2020-07-13 16:01:35
6300
发布2020-07-13 16:01:35
举报

1. 题目

把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。

你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。

代码语言:javascript
复制
示例 1:
输入: 1
输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]

示例 2:
输入: 2
输出: [0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0.11111,0.08333,0.05556,0.02778]
 
限制:
1 <= n <= 11

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/nge-tou-zi-de-dian-shu-lcof 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

类似题目:

LeetCode 1155. 掷骰子的N种方法(DP)

LeetCode 1223. 掷骰子模拟(DP)

  • 建立二维数组dp,dp[i][j] 表示第i次投下后,得分为j的次数
  • 那么状态转移方程是 dpi=∑dpi−1,1≤k≤6dpi = \sum dpi-1, 1\le k \le6dpi=∑dpi−1,1≤k≤6
代码语言:javascript
复制
class Solution {
public:
    vector<double> twoSum(int n) {
        vector<vector<int>> dp(n, vector<int>(6*n+1, 0));
        int i, j, k, count = pow(6,n);
        for(j = 1; j <= 6; ++j)
        	dp[0][j] = 1;
        for(i = 1; i < n; ++i)
        {
        	for(j = 6*i; j >= i; --j)
        	{
        		for(k = 6; k >= 1; --k)
        			dp[i][j+k] += dp[i-1][j];
        	}
        }
        vector<double> ans(5*n+1);
        k = 0;
        for(j = n; j <= 6*n; ++j)
            ans[k++] = double(dp[n-1][j])/count;
        return ans;
    }
};
  • 从上面可看出,状态转移方程仅与上一行有关,可以进行状态压缩
代码语言:javascript
复制
class Solution {
public:
    vector<double> twoSum(int n) {
        vector<int> dp(6*n+1, 0);
        vector<int> temp(6*n+1, 0);
        int i, j, k, count = pow(6,n);
        for(j = 1; j <= 6; ++j)
        	dp[j] = 1;
        for(i = 1; i < n; ++i)
        {
        	for(j = 6*i; j >= i; --j)
        	{
        		for(k = 6; k >= 1; --k)
        			temp[j+k] += dp[j];
        	}
        	swap(temp,dp);//更新dp数组
            for(j = 6*i; j >= i; --j)
                temp[j] = 0;//temp清零
        }
        vector<double> ans(5*n+1);
        k = 0;
        for(j = n; j <= 6*n; ++j)
            ans[k++] = double(dp[j])/count;
        return ans;
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-02-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档