经典动态规划问题
求一个序列中最长上升子序列的长度
- 令 d p [ i ] dp[i] dp[i]表示以 A [ i ] A[i] A[i]结尾的最长上升子序列的长度。
给定两个字符串A和B,求一个字符串,使得这个字符串是A和B的最长公共部分(子序列可以不连续)。
- 令 d p [ i ] [ j ] dp[i][j] dp[i][j]表示字符串A的 i i i号位和字符串B的 j j j号位之前的LCS长度。
给定一个数字序列 A 1 , A 2 , . . . . , A n A_1,A_2,....,A_n A1,A2,....,An,求 i , j ( 1 ⩽ i ⩽ j ⩽ n ) i,j(1 \leqslant i \leqslant j \leqslant n) i,j(1⩽i⩽j⩽n),使得 A i + . . . + A j A_i+...+Aj Ai+...+Aj最大,输出这个最大和。
- 令 d p [ i ] dp[i] dp[i]表示以 A [ i ] A[i] A[i]结尾的连续序列的最大和。
背包问题
多阶段动态规划问题
有一类动态规划问题,它可以描述成若干个有序的阶段,且每个阶段只和上一个阶段有关,一般把这类问题称为多阶段动态规划问题。
01背包 逆向枚举V
有 n n n件物品,每件物品的重量为 w [ i ] w[i] w[i],价值为 c [ i ] c[i] c[i]。现有一个容量为 V V V的背包,问如何选择物品放入背包,使得背包内物品的总价值最大。其中每种物品都只有1件。
- 令 d p [ i ] [ V ] dp[i][V] dp[i][V]表示前 i i i件物品恰好装入容量为 V V V的背包中所能获得的最大价值。
01背包中每个物品都可以看作一个阶段,这个阶段中的状态有 d p [ i ] [ 0 ] ∼ d p [ i ] [ V ] dp[i][0] \sim dp[i][V] dp[i][0]∼dp[i][V]。它们均由上一个阶段的状态得到。
事实上,对能够划分阶段的问题来说,都可以尝试把阶段作为状态的一维。
完全背包 正向枚举V
有 n n n种物品,每种物品的重量为 w [ i ] w[i] w[i],价值为 c [ i ] c[i] c[i]。现有一个容量为 V V V的背包,问如何选择物品放入背包,使得背包内物品的总价值最大。其中每种物品都有无穷件。
- 令 d p [ i ] [ V ] dp[i][V] dp[i][V]表示前 i i i种物品恰好装入容量为 V V V的背包中所能获得的最大价值。
多重背包问题
有 n n n种物品,每种物品的重量为 w [ i ] w[i] w[i],价值为 c [ i ] c[i] c[i],个数为 n u m [ i ] num[i] num[i]件。现有一个容量为 V V V的背包,问如何选择物品放入背包,使得背包内物品的总价值最大。
可以使用二进制进行优化转化成01背包问题