【动态规划】

经典动态规划问题
  1. 最长上升子序列

求一个序列中最长上升子序列的长度

  • d p [ i ] dp[i] dp[i]表示以 A [ i ] A[i] A[i]结尾的最长上升子序列的长度。
  1. 最长公共子序列

给定两个字符串A和B,求一个字符串,使得这个字符串是A和B的最长公共部分(子序列可以不连续)。

  • d p [ i ] [ j ] dp[i][j] dp[i][j]表示字符串A的 i i i号位和字符串B的 j j j号位之前的LCS长度。
  1. 最大连续子序列和

给定一个数字序列 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(1ijn),使得 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背包问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值