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)的条件下,dpij += dpi - 1j - 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)

相关推荐
mCell8 小时前
Lua 编程入门:从基础语法到元表
javascript·算法·lua
wuyk55510 小时前
98.C语言易混难点:字符数组与字符串指针的底层差异
c语言·开发语言·c++·stm32·嵌入式硬件·算法
峥无10 小时前
从0到1手撕红黑树:封装实现 my_map 与 my_set(SGI-STL 源码级深度解析)
开发语言·c++·笔记·算法·stl
不会代码的小猴11 小时前
3. 控件学习1
开发语言·c++·笔记·qt·算法
203号居民13 小时前
LeetCode hot 100 —41. 缺失的第一个正数
数据结构·算法·leetcode
专注仿真15 小时前
问答大模型技术方案算法实现-熵权法融合算法 + 交叉编码器重排算法
人工智能·python·算法·语言模型·问答大模型关键算法·熵权融合算法·交叉编码器重排算法
evans在进步15 小时前
LeetCode 322:零钱兑换——Java 动态规划详解
java·leetcode·动态规划
地平线开发者16 小时前
量化为什么会有损失:从量化误差到精度下降
算法
手写码匠16 小时前
华为云Flexus+DeepSeek征文|Dify 多 Agent 会话管理与上下文工程实战:让智能体“记住该记住的,忘掉该忘掉的“
人工智能·深度学习·算法·aigc