这里有 ddd 个一样的骰子,每个骰子上都有 fff 个面,分别标号为 1,2,...,f1, 2, ..., f1,2,...,f。

我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和。

如果需要掷出的总点数为 targettargettarget,请你计算出有多少种不同的组合情况(所有的组合情况总共有 fdf^dfd 种),模 109+710^9 + 7109+7 后返回。

示例 1:

输入:d = 1, f = 6, target = 3
输出:1

示例 2:

输入:d = 2, f = 6, target = 7
输出:6

示例 3:

输入:d = 2, f = 5, target = 10
输出:1

示例 4:

输入:d = 1, f = 2, target = 3
输出:0

示例 5:

输入:d = 30, f = 30, target = 500
输出:222616187

提示:

1 <= d, f <= 30
1 <= target <= 1000

——————————
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-dice-rolls-with-target-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

状态变量dp[i][j]表示用i个骰子得到的点数总和为j的方法总数;

因为一个骰子能够投掷出的点数的情况为f种,对于dp[i][j],要求得dp[i][j]的方法数,可以通过以下状态转移方程求得:

dp[i][j]=dp[i−1][j−1]+dp[i−1][j−2]+...+dp[i−1][j−n](j>=n)dp[i][j] = dp[i-1][j-1] + dp[i-1][j-2] + ... + dp[i-1][j-n](j>=n)dp[i][j]=dp[i−1][j−1]+dp[i−1][j−2]+...+dp[i−1][j−n](j>=n)

因此可以得到C++代码如下:

class Solution {public:int numRollsToTarget(int d, int f, int target) {vector<int> dp(target+1);  #用于存储状态变量,为了方便和从1开始的骰子点数配合,变量设置为target+1for(int i=1;i<=target;++i)   #初始化状态变量值,当只有一个骰子时的所有情况{if(i<=f)  #如果需要求的总点数小于等于骰子的点数,则将dp[i]设置为1dp[i] = 1;else    #如果需要求的总点数大于骰子的点数,则将dp[i]设置为0dp[i] = 0;}for(int i=2;i<=d;i++)  #从第二个骰子开始使用动态转移方程{for(int j=min(i*f,target);j>0;j--)  #两个骰子的最大可能取值的值为i*f,同时也有可能target小于i*f,因此取两者之间的较小值,这样可以减小程序的运行时间{dp[j]=0;  #这里必须将dp[i]重新设置为0,否则会导致错误,可以理解为当要求i个骰子取得j值的方法个数时,首先需要将方法数初始化为0for(int k=1;k<=f;k++)  #这里使用动态转移方程{if(j-k>0)dp[j] = (dp[j] + dp[j-k]) % 1000000007;}}}return dp[target];}
};

上面的C++代码中使用的是一维数组,如果想更好地理解,可以看下面的使用二维数组的C++代码:

class Solution {public:int numRollsToTarget(int d, int f, int target) {vector<vector<int>> dp(d+1,vector<int>(target+1));  #建立二维数组用于存储状态变量for(int i=1;i<=target;++i)  #初始化状态变量{if(i<=f)dp[1][i] = 1;elsedp[1][i] = 0;}for(int i=2;i<=d;i++)  #使用动态转移方程{for(int j=1;j<=min(target,i*f);j++){for(int k=1;k<=f;k++){if(j-k>0)dp[i][j] = (dp[i][j] + dp[i-1][j-k]) % 1000000007;}}}return dp[d][target];  #返回d个骰子掷出target点数的方法的个数}
};

leetcode - 1155. 掷骰子的N种方法相关推荐

  1. LeetCode 1155. 掷骰子的N种方法--动态规划

    掷骰子的N种方法 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target ...

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

    1. 题目 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target,请你 ...

  3. LeetCode 1155. 掷骰子的N种方法 每日一题

    问题描述 这里有 n 个一样的骰子,每个骰子上都有 k 个面,分别标号为 1 到 k . 给定三个整数 n ,  k 和 target ,返回可能的方式(从总共 kn 种方式中)滚动骰子的数量,使正面 ...

  4. Leetcode1155:掷骰子的N种方法

    Leetcode1155:掷骰子的N种方法 题目: 这里有 n 个一样的骰子,每个骰子上都有 k 个面,分别标号为 1 到 k . 给定三个整数 n , k 和 target ,返回可能的方式(从总共 ...

  5. leetcode算法题--掷骰子的N种方法

    原题链接:https://leetcode-cn.com/problems/number-of-dice-rolls-with-target-sum/ 动态规划 dp[i][k]表示前i个骰子,k表示 ...

  6. leetcode_1155 掷骰子的N种方法 动态规划

    LeetCode 1155 LeetCode Contest 149 No.2 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各 ...

  7. [Swift]LeetCode1155. 掷骰子的N种方法 | Number of Dice Rolls With Target Sum

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:为敢(WeiGanTechnologies) ➤博客园地址:山青咏芝(https://www.cnblo ...

  8. LeetCode-1155. 掷骰子的N种方法 ——动态规划

    这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target,请你计算出有多少 ...

  9. Leetcode-1155 Number of Dice Rolls With Target Sum(掷骰子的N种方法)

    dp[i][j]表示前i个骰子到达数字总和j的方案数 dp[i][j] = Σdp[i-1][j-k],其中k是一个骰子能掷出的范围 1 #define _for(i,a,b) for(int i = ...

最新文章

  1. aspose授权亲测可用配套代码
  2. 网站提示java已被阻止_Win7系统下打开网页提示应用程序已被JAVA安全阻止
  3. 矩阵的乘法和快速幂的一些理解(适用初学者)
  4. js笔记(四)内置对象Math和Date()、浏览器对象模型BOM
  5. 以下对c语言函数的描述中正确的是,以下对C语言函数的有关描述中,正确的是
  6. python D40 以及多表查询
  7. Android TeaPickerView数据级联选择器
  8. 比特大陆招股书讲了个AI的故事,但资本市场愿意听吗?
  9. 购买计算机相关配件的会计分录,购买电脑配件自己组装电脑怎么写会计分录
  10. 【行业聚焦】畅捷通用自然语言技术颠覆企业应用人机交互模式!
  11. 查找——图文翔解SkipList(跳跃表)
  12. android studio 讯飞语音,讯飞语音 使用步骤(针对androidStudio):语音转文字:(示例代码)...
  13. win10任务栏卡死桌面正常的解决方法
  14. 萤石开放平台-定时获取AccessToken
  15. Codeforces446C - DZY Loves Fibonacci Numbers
  16. LINUX uptime命令解读
  17. 浣溪沙·江畔芦花【明书词两首】
  18. 全球及中国汽车机电开关行业十四五发展规划及投资前景分析报告2022-2028年
  19. 【Grades Crawler】利用python编写爬虫 爬取西电教务处成绩并本地保存
  20. ad用户如何和计算机名对应,计算机加域和AD里相应对象的问题

热门文章

  1. Exchange 2007 删除 某时间段 特定主题 的邮件
  2. RTS与CTS的含义
  3. WCF分布式安全开发实践(6):传输安全模式之自定义X509Certificate证书验证
  4. 面试官系统精讲Java源码及大厂真题 - 34 只求问倒:连环相扣系列锁面试题
  5. Redis面试 - redis 的雪崩和穿透?
  6. git重命名远程仓库名字 同步fork代码
  7. 【Python爬虫】网络爬虫的“盗亦有道”
  8. C#开发笔记之13-如何用C#分隔字符串并返回字符串数组?
  9. 面向对象设计原则之7-迪米特法则
  10. 记录一次可能的order by注入