leetcode - 1155. 掷骰子的N种方法
这里有 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种方法相关推荐
- LeetCode 1155. 掷骰子的N种方法--动态规划
掷骰子的N种方法 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target ...
- LeetCode 1155. 掷骰子的N种方法(DP)
1. 题目 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target,请你 ...
- LeetCode 1155. 掷骰子的N种方法 每日一题
问题描述 这里有 n 个一样的骰子,每个骰子上都有 k 个面,分别标号为 1 到 k . 给定三个整数 n , k 和 target ,返回可能的方式(从总共 kn 种方式中)滚动骰子的数量,使正面 ...
- Leetcode1155:掷骰子的N种方法
Leetcode1155:掷骰子的N种方法 题目: 这里有 n 个一样的骰子,每个骰子上都有 k 个面,分别标号为 1 到 k . 给定三个整数 n , k 和 target ,返回可能的方式(从总共 ...
- leetcode算法题--掷骰子的N种方法
原题链接:https://leetcode-cn.com/problems/number-of-dice-rolls-with-target-sum/ 动态规划 dp[i][k]表示前i个骰子,k表示 ...
- leetcode_1155 掷骰子的N种方法 动态规划
LeetCode 1155 LeetCode Contest 149 No.2 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各 ...
- [Swift]LeetCode1155. 掷骰子的N种方法 | Number of Dice Rolls With Target Sum
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:为敢(WeiGanTechnologies) ➤博客园地址:山青咏芝(https://www.cnblo ...
- LeetCode-1155. 掷骰子的N种方法 ——动态规划
这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target,请你计算出有多少 ...
- 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 = ...
最新文章
- aspose授权亲测可用配套代码
- 网站提示java已被阻止_Win7系统下打开网页提示应用程序已被JAVA安全阻止
- 矩阵的乘法和快速幂的一些理解(适用初学者)
- js笔记(四)内置对象Math和Date()、浏览器对象模型BOM
- 以下对c语言函数的描述中正确的是,以下对C语言函数的有关描述中,正确的是
- python D40 以及多表查询
- Android TeaPickerView数据级联选择器
- 比特大陆招股书讲了个AI的故事,但资本市场愿意听吗?
- 购买计算机相关配件的会计分录,购买电脑配件自己组装电脑怎么写会计分录
- 【行业聚焦】畅捷通用自然语言技术颠覆企业应用人机交互模式!
- 查找——图文翔解SkipList(跳跃表)
- android studio 讯飞语音,讯飞语音 使用步骤(针对androidStudio):语音转文字:(示例代码)...
- win10任务栏卡死桌面正常的解决方法
- 萤石开放平台-定时获取AccessToken
- Codeforces446C - DZY Loves Fibonacci Numbers
- LINUX uptime命令解读
- 浣溪沙·江畔芦花【明书词两首】
- 全球及中国汽车机电开关行业十四五发展规划及投资前景分析报告2022-2028年
- 【Grades Crawler】利用python编写爬虫 爬取西电教务处成绩并本地保存
- ad用户如何和计算机名对应,计算机加域和AD里相应对象的问题
热门文章
- Exchange 2007 删除 某时间段 特定主题 的邮件
- RTS与CTS的含义
- WCF分布式安全开发实践(6):传输安全模式之自定义X509Certificate证书验证
- 面试官系统精讲Java源码及大厂真题 - 34 只求问倒:连环相扣系列锁面试题
- Redis面试 - redis 的雪崩和穿透?
- git重命名远程仓库名字 同步fork代码
- 【Python爬虫】网络爬虫的“盗亦有道”
- C#开发笔记之13-如何用C#分隔字符串并返回字符串数组?
- 面向对象设计原则之7-迪米特法则
- 记录一次可能的order by注入