Leetcode1155. 掷骰子等于目标和的方法数

Every day a Leetcode

题目来源:1155. 掷骰子等于目标和的方法数

解法1:动态规划

设置状态转移矩阵:

cpp 复制代码
vector<vector<int>> dp(n + 1, vector<int>(target + 1, 0));

也可以设成 n*k+1 的大小,大部分情况下设置成 target+1 能节省内存。

初始化时,我们丢第一个骰子,出现 1~k 点数:

cpp 复制代码
// 初始化
for (int i = 1; i <= k && i <= target; i++)
	dp[1][i] = 1;

从上一层结果,丢一个骰子,状态转移到下一层。

设 i 为丢的骰子数,j 为当前层的总点数,x 为当前丢骰子的点数,枚举 x = 1~k,j-x 就是上一层丢的总点数,在满足 j - x >= i - 1 && j - x <= k * (i - 1)的条件下,dp[i][j] += dp[i - 1][j - x],在与 MOD( 1e9 + 7) 取余。

条件j - x >= i - 1 && j - x <= k * (i - 1)的意思是:

前 i-1 个骰子至少要丢 i-1 个点数,最多丢 k * (i - 1) 个点数。事实上,只限定 j - x >= 1 也能通过这些样例。

状态转移方程:

cpp 复制代码
// 动态规划
for (int i = 2; i <= n; i++)
	for (int j = 0; j <= target; j++)
	{
		for (int x = 1; x <= k; x++)
			if (j - x >= i - 1 && j - x <= k * (i - 1))
				dp[i][j] = (dp[i][j] + dp[i - 1][j - x]) % MOD;
	}

代码:

c 复制代码
/*
 * @lc app=leetcode.cn id=1155 lang=cpp
 *
 * [1155] 掷骰子等于目标和的方法数
 */

// @lc code=start
class Solution
{
private:
    static const int MOD = 1e9 + 7;

public:
    int numRollsToTarget(int n, int k, int target)
    {
        vector<vector<int>> dp(n + 1, vector<int>(target + 1, 0));
        // 初始化
        for (int i = 1; i <= k && i <= target; i++)
            dp[1][i] = 1;
        // 动态规划
        for (int i = 2; i <= n; i++)
            for (int j = 0; j <= target; j++)
            {
                for (int x = 1; x <= k; x++)
                    if (j - x >= i - 1 && j - x <= k * (i - 1))
                        dp[i][j] = (dp[i][j] + dp[i - 1][j - x]) % MOD;
            }
        return dp[n][target];
    }
};
// @lc code=end

结果:

复杂度分析:

时间复杂度:O(n * k * target)

空间复杂度:O(n * target)

相关推荐
超级皮皮3 小时前
力扣热题之stack
算法·leetcode·职场和发展
weixin_470740364 小时前
某算法的python执行汇编
汇编·python·算法
是乐谷5 小时前
燧原科技招大模型训练算法工程师
科技·算法
YuTaoShao5 小时前
【LeetCode 热题 100】139. 单词拆分——(解法一)记忆化搜索
java·算法·leetcode·职场和发展
圣保罗的大教堂5 小时前
leetcode 1277. 统计全为 1 的正方形子矩阵 中等
leetcode
小马学嵌入式~6 小时前
数据结构:队列 二叉树
c语言·开发语言·数据结构·算法
焊锡与代码齐飞7 小时前
嵌入式第三十五课!!Linux下的网络编程
linux·运维·服务器·开发语言·网络·学习·算法
省四收割者8 小时前
Go语言入门(10)-数组
数据结构·经验分享·笔记·vscode·算法·golang
lxmyzzs8 小时前
【图像算法 - 21】慧眼识虫:基于深度学习与OpenCV的农田害虫智能识别系统
人工智能·深度学习·opencv·算法·yolo·目标检测·计算机视觉
KeithTsui8 小时前
GCC C语言整数转换的理解(Understanding of Integer Conversions in C with GCC)
c语言·开发语言·算法