• home > theory > algorithm > leetcode >

    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 问题中各种类型问题进行一一讲解。

    单串线性 DP 问题

    单串线性 DP 问题:问题的输入为单个数组或单个字符串的线性 DP 问题。状态一般可定义为dp[i],表示为:

    1. 「以数组中第i 个位置元素 nums[i] 为结尾的子数组(nums[0]...nums[i])」的相关解。

    2. 「以数组中第 i−1 个位置元素nums[i−1] 为结尾的子数组(nums[0]...nums[i−1])」的相关解。

    3. 「以数组中前 i 个元素为子数组(nums[0]...nums[i−1])」的相关解。

    这 3种状态的定义区别在于相差一个元素nums[i]。

    1. 第 1 种状态:子数组的长度为 i+1,子数组长度不可为空;

    2. 第 2种状态、第 3 种状态:这两种状态描述是相同的。子数组的长度为i,子数组长度可为空。在i=0 时,方便用于表示空数组(以数组中前 0 个元素为子数组)。

    双串线性 DP 问题

    双串线性 DP 问题:问题的输入为两个数组或两个字符串的线性 DP 问题。状态一般可定义为dp[i][j],表示为:

    1. 「以第一个数组中第i 个位置元素 nums1[i] 为结尾的子数组(nums1[0]...nums1[i])」与「以第二个数组中第 j 个位置元素 nums2[j] 为结尾的子数组(nums2[0]...nums2[j])」的相关解。

    2. 「以第一个数组中第 i−1 个位置元素 nums1[i−1] 为结尾的子数组(nums1[0]...nums1[i−1])」与「以第二个数组中第 j−1 个位置元素 nums2[j−1] 为结尾的子数组(nums2[0]...nums2[j−1])」的相关解。

    3. 「以第一个数组中前 i 个元素为子数组(nums1[0]...nums1[i−1])」与「以第二个数组中前 j 个元素为子数组(nums2[0]...nums2[j−1])」的相关解。

    这 33 种状态的定义区别在于相差一个元素 nums1[i] 或 nums2[j]。

    1. 第 11 种状态:子数组的长度为 i+1 或 j+1,子数组长度不可为空

    2. 第 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打家劫舍 IIPython数组、动态规划中等
    0740删除并获得点数
    数组、哈希表、动态规划中等
    13883n 块披萨
    贪心、数组、动态规划、堆(优先队列)困难
    0873最长的斐波那契子序列的长度Python数组、哈希表、动态规划中等
    1027最长等差数列
    数组、哈希表、二分查找、动态规划中等
    1055形成字符串的最短路径
    贪心、双指针、字符串中等
    0368最大整除子集
    数组、数学、动态规划、排序中等
    0032最长有效括号Python栈、字符串、动态规划困难
    0413等差数列划分
    数组、动态规划中等
    0091解码方法Python字符串、动态规划中等
    0639解码方法 IIPython字符串、动态规划困难
    0132分割回文串 II
    字符串、动态规划困难
    1220统计元音字母序列的数目Python动态规划困难
    0338比特位计数Python位运算、动态规划简单
    0801使序列递增的最小交换次数Python数组、动态规划困难
    0871最低加油次数
    贪心、数组、动态规划、堆(优先队列)困难
    0045跳跃游戏 IIPython贪心、数组、动态规划中等
    0813最大平均值和的分组
    数组、动态规划、前缀和中等
    0887鸡蛋掉落Python数学、二分查找、动态规划困难
    0256粉刷房子
    数组、动态规划中等
    0265粉刷房子 II
    数组、动态规划困难
    1473粉刷房子 III
    数组、动态规划困难
    0975奇偶跳
    栈、数组、动态规划、有序集合、单调栈困难
    0403青蛙过河Python数组、动态规划困难
    1478安排邮筒
    数组、数学、动态规划、排序困难
    1230抛掷硬币
    数学、动态规划、概率与统计中等
    0410分割数组的最大值Python贪心、数组、二分查找、动态规划、前缀和困难
    1751最多可以参加的会议数目 II
    数组、二分查找、动态规划、排序困难
    1787使所有区间的异或结果为零
    位运算、数组、动态规划困难
    0121买卖股票的最佳时机Python数组、动态规划简单
    0122买卖股票的最佳时机 IIPython贪心、数组中等
    0123买卖股票的最佳时机 IIIPython数组、动态规划困难
    0188买卖股票的最佳时机 IVPython数组、动态规划困难
    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杨辉三角 IIPython数组、动态规划简单
    0120三角形最小路径和Python数组、动态规划中等
    0064最小路径和Python数组、动态规划、矩阵中等
    0174地下城游戏
    数组、动态规划、矩阵困难
    0221最大正方形Python数组、动态规划、矩阵中等
    0931下降路径最小和
    数组、动态规划、矩阵中等
    0576出界的路径数Python动态规划中等
    0085最大矩形
    栈、数组、动态规划、矩阵、单调栈困难
    0363矩形区域不超过 K 的最大数值和
    数组、二分查找、矩阵、有序集合、前缀和困难
    面试题 17.24最大子矩阵
    数组、动态规划、矩阵、前缀和困难
    1444切披萨的方案数
    记忆化搜索、数组、动态规划、矩阵困难

    无串线性 DP 问题

    题号标题题解标签难度
    1137第 N 个泰波那契数Python记忆化搜索、数学、动态规划简单
    0650只有两个键的键盘Python数学、动态规划中等
    0264丑数 IIPython哈希表、数学、动态规划、堆(优先队列)中等
    0279完全平方数Python广度优先搜索、数学、动态规划中等
    0343整数拆分Python数学、动态规划中等



    转载本站文章《DP笔记(2):线性DP概念与例题集合》,
    请注明出处:https://www.zhoulujun.cn/html/theory/algorithm/leetcode/9111.html