动态规划

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

用于解决重叠子问题

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值