algorithm-dp-split
划分型dp
对数组或者字符串进行位置划分,划分成几个子数组或者子字符串
判定能否划分
一般定义f[i]表示长为i的前缀a[:i]能否划分,枚举最后一个子数组的左端点L,从f[L]转移到f[i],并考虑a[L:j]是否满足要求
2369. 检查数组是否存在有效划分(1780)
计算划分最优值
定义f[i]表示对于前缀[0:i)所得到的最优解,枚举最后一个子数组的左端点L,从f[L]转移到f[i],并考虑子数组[L:i)对最优解的影响
2707. 字符串中的额外字符(1736)
约束划分个数
定义f[i][j]表示对于前缀[0:i)划分成j个连续子数组所得到的最优解,枚举最后一个子数组的左端点L,从f[L][j-1]转移到f[i][j],并考虑子数组[L:i)对最优解的影响
2911. 得到 K 个半回文串的最少修改次数(2608)
不相交区间
2008. 出租车的最大盈利(1872)
algorithm-dp-data-structure-optimization
数据结构优化dp
其它优化dp
3181. 执行操作可获得的最大总奖励 II
algorithm-dp-grid
网格图dp
在网格图上的移动
62. 不同路径
1594. 矩阵的最大非负积
algorithm-dp-bag
背包
0-1背包
给定一个背包的容量c和n个物品,第i个物品的体积为w[i],价值为v[i]。每个物品选或不选,求体积和不超过capacity时的最大价值和
核心思路:枚举第i个物品选或不选
初始化一个二维数组dp,其中dp[i][j]表示在考虑前i个物品、背包容量为j的情况下的最大总价值
dp[i][c] = max(dp[i-1][c], dp[i-1][c-w[i]] + v[i])
背包至多装capacity
求方案数
求最大价值和(传统01背包)
背包恰好装capacity
求方案数: 494. 目标和
求最大价值和
求最小价值和
背包最少装capacity
求方案数
求最小价值和
其它
3180. 执行操作可获得的最大总奖励 I
完全背包
给定一个背包的容量c和n种物品,第i种物品的体积为w[i],价值为v[i]。每种物品无限次重复选,求体积和不超过capacity时的最大价值和
考虑第i个物品选不选时,可以重复选择,所以这里考虑dp[i][c]时,可能多次更新dp[i][c-w[i]] + v[i]
dp[i][c] = max(dp[i-1] ...