0
点赞
收藏
分享

微信扫一扫

经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)


文章目录

  • ​​1 模型列举​​
  • ​​1.1最大连续子序列和​​
  • ​​1.2最长不下降子序列(LIS)​​
  • ​​1.3 最长公共子序列LCS​​
  • ​​1.4 最长回文子串​​
  • ​​1.5 数塔DP​​
  • ​​1.6 DAG最长路​​
  • ​​1.8 0-1背包​​
  • ​​1.9 完全背包​​
  • ​​2 总结​​
  • ​​2.1 类型一​​
  • ​​2.2 类型二​​

1 模型列举

1.1最大连续子序列和

​ 令dp[i]表示A[i]结尾的连续序列最大和(A[i]必须为连续序列的末尾)【不然就会产生多个相同的dp[i]】。

状态转移方程:
经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)_最长路
边界:
经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)_数组_02

1.2最长不下降子序列(LIS)

​ 令dp[i]表示最长不下降序列长度(必须以A[i]结尾)。

状态转移方程
经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)_状态转移_03

边界:
经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)_状态转移_04

1.3 最长公共子序列LCS

​ 令dp[i][j]表示字符串A的i号位和字符串B的j号位之前的LCS长度(下标从1开始)。

状态转移方程
经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)_状态转移_05
边界:
经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)_状态转移_06

1.4 最长回文子串

​ 令dp[i][j]表示S[i]至S[j]所表示的子串是否是回文串,是则为1,不是为0。

状态转移方程
经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)_最长路_07

边界:
经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)_数组_08

1.5 数塔DP

​ 令dp[i][j]表示从第i行第j个数字出发的到达最低层的所有路径上所能得到的最大和。

状态转移方程
经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)_状态转移_09
边界(直接确定其结果):数组dp最后一层dp总是等于元素自身

1.6 DAG最长路

​ 令dp[i]表示从i号顶点出发的获得的最长路径长度。

状态转移方程
不固定终点/不固定终点:
经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)_数组_10
边界:
不固定终点:
从出度为0的顶点出发的最长路径长度为0(对整个数组dp初始化为0)
固定终点:
经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)_状态转移_11(T为终点,初始化dp数组作为一个负的大数)

1.8 0-1背包

令dp[i][v]表示前i件物品( 1 经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)_最长路_12 i 经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)_最长路_12 n, 0 经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)_最长路_12 v 经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)_最长路_12 V)恰好装入容量为v的背包中所能获得的最大值。

状态转移方程
经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)_最长路_16

边界:
经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)_最长路_17

1.9 完全背包

令dp[i][v]表示前i件物品( 1 经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)_最长路_12 i 经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)_最长路_12 n, 0 经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)_最长路_12 v 经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)_最长路_12 V)恰好装入容量为v的背包中所能获得的最大值。

状态转移方程:
经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)_数组_22
边界:
经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)_数组_23

2 总结

2.1 类型一

XXX:为原问题的描述

  • 第一节1~4都是有关序列或字符串的问题(一般来说“子序列可以不连续、子串必须要连续”),
  • (1)(2)的设计状态都是“令dp[i]表示以A[i]结尾的XXX”,
  • 而 (3)(4)由于原问题本身就有二维性质,因此使用了“令dp[i][j]表示i号位和j号位之间XXX“的状态设计方式“

当题目与序列和字符串(记为A)有关时,可以考虑把状态设计为下面两种形式,然后根据端点特性考虑状态转移方程。

  • 1 令dp[i]表示以A[i]结尾(或开头)的XXX;
  • 2 令dp[i][j]表示i号位和j号位之间XXX。

2.2 类型二

(5)~(8),它们的状态设计都包括了某种“方向” 的意思,
如数塔DP设计为从(i,j)出发到达最底层的最大和
DAG设计为从i号顶点出发的最长路
背包问题设计为前i件物品恰好放容量为v的背包中能获得的最大价值。

当题目中的状态需要几维来表示,然后对其中的每一维采取下面的某一种描述:

  • 1 恰好为i;
  • 2 前i;
    在每一维的含义设计完毕之后,dp数组的含义就可以设置为“令dp数组恰好为i(或前i),恰好为j(或前j)……的XXX”,然后就可以通过端点的特性来考虑状态转移方程。

大多数情况,可以把动态规划可解的问题看成一个有向无环图(DAG),图中的结点就是状态,边就是状态转移方向,求解问题的顺序就可以按照DAG的拓扑顺序进行求解。

举报

相关推荐

0 条评论