DP笔记(2):线性DP概念与例题集合
Author:zhoulujun Date:
线性动态规划简介
线性动态规划:具有「线性」阶段划分的动态规划方法统称为线性动态规划(简称为「线性 DP」),如下图所示。
如果状态包含多个维度,但是每个维度上都是线性划分的阶段,也属于线性 DP。比如背包问题、区间 DP、数位 DP 等都属于线性 DP。
线性 DP 问题的划分方法有多种方式。
如果按照「状态的维度数」进行分类,我们可以将线性 DP 问题分为:
一维线性 DP 问题
二维线性 DP 问题
多维线性 DP 问题
如果按照「问题的输入格式」进行分类,我们可以将线性 DP 问题分为:
单串线性 DP 问题
双串线性 DP 问题
矩阵线性 DP 问题
无串线性 DP 问题
按照状态的维度数来分类,确实非常好辨认。本文中,我们将按照问题的输入格式进行分类,对线性 DP 问题中各种类型问题进行一一讲解。
单串线性 DP 问题
单串线性 DP 问题:问题的输入为单个数组或单个字符串的线性 DP 问题。状态一般可定义为dp[i],表示为:
「以数组中第i 个位置元素 nums[i] 为结尾的子数组(nums[0]...nums[i])」的相关解。
「以数组中第 i−1 个位置元素nums[i−1] 为结尾的子数组(nums[0]...nums[i−1])」的相关解。
「以数组中前 i 个元素为子数组(nums[0]...nums[i−1])」的相关解。
这 3种状态的定义区别在于相差一个元素nums[i]。
第 1 种状态:子数组的长度为 i+1,子数组长度不可为空;
第 2种状态、第 3 种状态:这两种状态描述是相同的。子数组的长度为i,子数组长度可为空。在i=0 时,方便用于表示空数组(以数组中前 0 个元素为子数组)。
双串线性 DP 问题
双串线性 DP 问题:问题的输入为两个数组或两个字符串的线性 DP 问题。状态一般可定义为dp[i][j],表示为:
「以第一个数组中第i 个位置元素 nums1[i] 为结尾的子数组(nums1[0]...nums1[i])」与「以第二个数组中第 j 个位置元素 nums2[j] 为结尾的子数组(nums2[0]...nums2[j])」的相关解。
「以第一个数组中第 i−1 个位置元素 nums1[i−1] 为结尾的子数组(nums1[0]...nums1[i−1])」与「以第二个数组中第 j−1 个位置元素 nums2[j−1] 为结尾的子数组(nums2[0]...nums2[j−1])」的相关解。
「以第一个数组中前 i 个元素为子数组(nums1[0]...nums1[i−1])」与「以第二个数组中前 j 个元素为子数组(nums2[0]...nums2[j−1])」的相关解。
这 33 种状态的定义区别在于相差一个元素 nums1[i] 或 nums2[j]。
第 11 种状态:子数组的长度为 i+1 或 j+1,子数组长度不可为空
第 22 种状态、第 33 种状态:子数组的长度为 i 或 j,子数组长度可为空。i=0 或j=0 时,方便用于表示空数组(以数组中前 00 个元素为子数组)。
矩阵线性 DP问题
矩阵线性 DP 问题:问题的输入为二维矩阵的线性 DP 问题。状态一般可定义为 dp[i][j],表示为:从「位置 (0,0)(0,0)」到达「位置 (i,j)」的相关解。
无串线性 DP 问题
无串线性 DP 问题:问题的输入不是显式的数组或字符串,但依然可分解为若干子问题的线性 DP 问题。
线性 DP 题目
单串线性 DP 问题
题号 | 标题 | 题解 | 标签 | 难度 |
---|---|---|---|---|
0300 | 最长递增子序列 | Python | 数组、二分查找、动态规划 | 中等 |
0673 | 最长递增子序列的个数 | Python | 树状数组、线段树、数组、动态规划 | 中等 |
0354 | 俄罗斯套娃信封问题 | Python | 数组、二分查找、动态规划、排序 | 困难 |
0053 | 最大子数组和 | Python | 数组、分治、动态规划 | 中等 |
0152 | 乘积最大子数组 | Python | 数组、动态规划 | 中等 |
0918 | 环形子数组的最大和 | Python | 队列、数组、分治、动态规划、单调队列 | 中等 |
0198 | 打家劫舍 | Python | 数组、动态规划 | 中等 |
0213 | 打家劫舍 II | Python | 数组、动态规划 | 中等 |
0740 | 删除并获得点数 | 数组、哈希表、动态规划 | 中等 | |
1388 | 3n 块披萨 | 贪心、数组、动态规划、堆(优先队列) | 困难 | |
0873 | 最长的斐波那契子序列的长度 | Python | 数组、哈希表、动态规划 | 中等 |
1027 | 最长等差数列 | 数组、哈希表、二分查找、动态规划 | 中等 | |
1055 | 形成字符串的最短路径 | 贪心、双指针、字符串 | 中等 | |
0368 | 最大整除子集 | 数组、数学、动态规划、排序 | 中等 | |
0032 | 最长有效括号 | Python | 栈、字符串、动态规划 | 困难 |
0413 | 等差数列划分 | 数组、动态规划 | 中等 | |
0091 | 解码方法 | Python | 字符串、动态规划 | 中等 |
0639 | 解码方法 II | Python | 字符串、动态规划 | 困难 |
0132 | 分割回文串 II | 字符串、动态规划 | 困难 | |
1220 | 统计元音字母序列的数目 | Python | 动态规划 | 困难 |
0338 | 比特位计数 | Python | 位运算、动态规划 | 简单 |
0801 | 使序列递增的最小交换次数 | Python | 数组、动态规划 | 困难 |
0871 | 最低加油次数 | 贪心、数组、动态规划、堆(优先队列) | 困难 | |
0045 | 跳跃游戏 II | Python | 贪心、数组、动态规划 | 中等 |
0813 | 最大平均值和的分组 | 数组、动态规划、前缀和 | 中等 | |
0887 | 鸡蛋掉落 | Python | 数学、二分查找、动态规划 | 困难 |
0256 | 粉刷房子 | 数组、动态规划 | 中等 | |
0265 | 粉刷房子 II | 数组、动态规划 | 困难 | |
1473 | 粉刷房子 III | 数组、动态规划 | 困难 | |
0975 | 奇偶跳 | 栈、数组、动态规划、有序集合、单调栈 | 困难 | |
0403 | 青蛙过河 | Python | 数组、动态规划 | 困难 |
1478 | 安排邮筒 | 数组、数学、动态规划、排序 | 困难 | |
1230 | 抛掷硬币 | 数学、动态规划、概率与统计 | 中等 | |
0410 | 分割数组的最大值 | Python | 贪心、数组、二分查找、动态规划、前缀和 | 困难 |
1751 | 最多可以参加的会议数目 II | 数组、二分查找、动态规划、排序 | 困难 | |
1787 | 使所有区间的异或结果为零 | 位运算、数组、动态规划 | 困难 | |
0121 | 买卖股票的最佳时机 | Python | 数组、动态规划 | 简单 |
0122 | 买卖股票的最佳时机 II | Python | 贪心、数组 | 中等 |
0123 | 买卖股票的最佳时机 III | Python | 数组、动态规划 | 困难 |
0188 | 买卖股票的最佳时机 IV | Python | 数组、动态规划 | 困难 |
0309 | 最佳买卖股票时机含冷冻期 | Python | 数组、动态规划 | 中等 |
0714 | 买卖股票的最佳时机含手续费 | Python | 贪心、数组 | 中等 |
双串线性 DP 问题
题号 | 标题 | 题解 | 标签 | 难度 |
---|---|---|---|---|
1143 | 最长公共子序列 | Python | 字符串、动态规划 | 中等 |
0712 | 两个字符串的最小ASCII删除和 | 字符串、动态规划 | 中等 | |
0718 | 最长重复子数组 | Python | 数组、二分查找、动态规划、滑动窗口、哈希函数、滚动哈希 | 中等 |
0583 | 两个字符串的删除操作 | Python | 字符串、动态规划 | 中等 |
0072 | 编辑距离 | Python | 字符串、动态规划 | 困难 |
0044 | 通配符匹配 | Python | 贪心、递归、字符串、动态规划 | 困难 |
0010 | 正则表达式匹配 | Python | 递归、字符串、动态规划 | 困难 |
0097 | 交错字符串 | 字符串、动态规划 | 中等 | |
0115 | 不同的子序列 | Python | 字符串、动态规划 | 困难 |
0087 | 扰乱字符串 | 字符串、动态规划 | 困难 |
矩阵线性 DP 问题
题号 | 标题 | 题解 | 标签 | 难度 |
---|---|---|---|---|
0118 | 杨辉三角 | Python | 数组、动态规划 | 简单 |
0119 | 杨辉三角 II | Python | 数组、动态规划 | 简单 |
0120 | 三角形最小路径和 | Python | 数组、动态规划 | 中等 |
0064 | 最小路径和 | Python | 数组、动态规划、矩阵 | 中等 |
0174 | 地下城游戏 | 数组、动态规划、矩阵 | 困难 | |
0221 | 最大正方形 | Python | 数组、动态规划、矩阵 | 中等 |
0931 | 下降路径最小和 | 数组、动态规划、矩阵 | 中等 | |
0576 | 出界的路径数 | Python | 动态规划 | 中等 |
0085 | 最大矩形 | 栈、数组、动态规划、矩阵、单调栈 | 困难 | |
0363 | 矩形区域不超过 K 的最大数值和 | 数组、二分查找、矩阵、有序集合、前缀和 | 困难 | |
面试题 17.24 | 最大子矩阵 | 数组、动态规划、矩阵、前缀和 | 困难 | |
1444 | 切披萨的方案数 | 记忆化搜索、数组、动态规划、矩阵 | 困难 |
无串线性 DP 问题
题号 | 标题 | 题解 | 标签 | 难度 |
---|---|---|---|---|
1137 | 第 N 个泰波那契数 | Python | 记忆化搜索、数学、动态规划 | 简单 |
0650 | 只有两个键的键盘 | Python | 数学、动态规划 | 中等 |
0264 | 丑数 II | Python | 哈希表、数学、动态规划、堆(优先队列) | 中等 |
0279 | 完全平方数 | Python | 广度优先搜索、数学、动态规划 | 中等 |
0343 | 整数拆分 | Python | 数学、动态规划 | 中等 |
转载本站文章《DP笔记(2):线性DP概念与例题集合》,
请注明出处:https://www.zhoulujun.cn/html/theory/algorithm/leetcode/9111.html