用于解决重叠子问题
1.01背包
【问题描述】有n个重量和价值为wi, vi的物品,从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值。不能切割。
【算法】
【代码】非记忆型
记忆型递归,将映射记下来
【动态规划】
2. 钢条切割
【递推】
【记忆型递推】
【动态规划】
全保留和保留和剩下的最大值
3. 在数字三角形中寻找一条从顶部到底边的路径, 使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或右下走。只需要求出这个最大和即可,不必给出具体路径。三角形的行数大于1小于等于100,数字为0 - 99
【dfs递归方法】
【记忆型递归】
【动态规划】
可以用滚动数组来节约空间,覆盖没有用的数据
4.最长公共子序列(LCS)
【双重循环+递归】
for i 每个打头
for s2 找相同
找到了:结果+递归结果----->比较
没找到
【dp方程】
5. 完全背包问题
有n个重量和价值分别为wi,vi的物品, 从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值。
每种物品可以要多个
max(v[i]+dp[i][j-w[i]],dp[i-1][j]) 选当前行或者不选当前行
6.最长上升子序列问题
【暴力破解法】
cnt初始化为1
【dp方法1】
【dp方法2】
dp[i] 长度为i的LIS的末尾的数
1替换第一个比他大的数字,维持长度,相对较大的数作更大的贡献
优化:
扫描dp数组可以用二分法,因为有序,一直是替换第一个比他大的 ,在优化之后,可以达到O(NLgN)