用于解决重叠子问题
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)


文章介绍了使用动态规划和记忆化策略解决一系列计算机科学中的经典问题,包括0-1背包问题、钢条切割优化、数字三角形的最大和路径、最长公共子序列计算、完全背包问题以及最长上升子序列问题。对于每个问题,都提到了递归、记忆化和动态规划的解法,并在某些情况下讨论了空间优化技巧,如滚动数组和二分查找法。
7万+

被折叠的 条评论
为什么被折叠?



