动态规划系列

1.最长递增子序列:

(1)动态规划解法:分配一个dp数组用来用来存放以当前下标的元素为结尾的最长子序列,那么最终结果就是dp数组中的最大值。dp数组初始值设为1,如何来设计动态规划:判断此下标元素与之前所有下标元素的大小关系,可能就会产生一系列的新子序列,但是只选择最长的那一个。最后找出dp数组中的最大值。

(2)二分搜索解法:利用纸牌的思想:只能把点数小的牌压到和它大与等于的牌上,如果当前牌数不满足条件就新开一个牌堆,把这张牌放进去;如果当前牌有多个队可供选择,则选择最左边的那一堆放置。最后牌的堆数就是最长子序列的长度。因此每次对一个新牌进行放置时都要找到满足要求的最左侧的牌堆,就要进行二分搜索(因为最终结果是牌的堆数,所以用一维数组就可以,可以直接替换不需要保存),如果找不到就新开辟一个牌堆,此牌放入堆顶(所谓堆顶也就是无所谓),记录牌堆树的元素加一。

2.二维递增子序列(信封嵌套):

思路分析:先对宽度 w 进行升序排序,如果遇到 w 相同的情况,则按照高度 h 进行降序排序。之后把所有的 h 作为一个数组,在这个数组上计算出的 LIS(最长递增子序列 Longest Increasing Subsequence) 的长度就是答案。也可以反过来对长度先进行升序,然后对宽度进行降序。

3.最大子数组问题:

子数组是连续性的,根LIS最大的不同,因此dp数组的含义定义有区别,dp i 的两种选择:要么与前面的相邻子数组连接,形成一个更大的子数组,要么不与其相连,自成一派,自己作为一个子数组。实际完全不需要一个dp数组,因为dp里的元素时实时更新的,最大的一定是最后一个元素,所以完全可以用两个变量(dp-i, dp-i-1)来替代,减少空间复杂度。

4.最优子结构与dp数组的遍历方向:

最优子结构是很多问题具有的性质。

dp数组的遍历方向拿二维数组来说基本有三中:正向、反向、斜向。

动态规划问题最重要的推导状态转移方程,猜测最终结果可能是从哪个方向来的。

有时候需要考虑最终结果的位置来确定是哪种遍历方式,有时候多种遍历方式都可以。

5.编辑距离:

题目:对于两个字符串:s1,s2,可以对s1进行三种操作:插入、删除、替换一个字符。计算将s1转换成s2最少需要多少次操作。

思路:解决两个字符串的动态规划问题一般都是用两个指针 i ,j 分别指向两个字符串的最后,然后一步一步往前走,缩小问题个规模。

两种容易处理的情况:就是 j 走完时如果 i 没走完,那么只能用删除操作将s1 缩短为 s2,反之,若 i 走完是 j 还没走完那么只能用插入操作将s2剩余的字符全部插入到s1中。用迭代实现。

利用dp二维数组来存储已经计算好的字符串来减少巨量计算量,动态规划中的dp数组的初始化比较不同设两字符串的长度分别为length1,length2,那么数组的大小应为length1+1 * length2 +1,第0行和第0列的分别表示i,j 到头是应该进行的操作数量,分别等于剩余的列数和行数,dpi+1j+1要考虑四种情况:1.待比较的两字符相等;2.需要插入;3,需要替换;4,需要删除。因此要比较后三种哪种操作带来的操作数最小。以此类推,最小操作数将存放在dplength1length2中,将其返回即可。

相关推荐
leisoo80973 小时前
财报数据怎么排雷本地化Python构建财务异常预警系统
人工智能·python·算法
luj_17685 小时前
塔防牌:策略与卡牌的智慧碰撞
服务器·c语言·开发语言·经验分享·算法
郝学胜-神的一滴5 小时前
干货版《算法导论》17:二叉树核心原理、遍历逻辑与高阶实操全解
数据结构·c++·python·算法·计算机·编程
爱编程的小新☆6 小时前
【LeetCode】从递归到 Flood Fill:5 道题吃透 DFS 的选择、回溯与标记
java·算法·leetcode·深度优先·回溯·flood fill
Water_Sunzhipeng6 小时前
2024牛客暑期多校训练营1
算法
hetao17338376 小时前
2026-08-09~08-14 hetao1733837 的刷题记录
c++·算法
技术小黑6 小时前
RNN算法实战系列06 | LSTM 实现糖尿病探索与预测
rnn·算法·lstm
疯狂打码的少年6 小时前
【数据结构】二叉树的性质(五大性质+计算)
数据结构·笔记·算法
wabs6667 小时前
关于图论【A*算法 | 卡码网127.骑士的攻击的思考】
数据结构·算法·图论·卡码网·广搜的改进版
CIO_Alliance7 小时前
AI认知系列(3)| 数据、算法、算力、场景四要素协同
人工智能·算法·ipaas·系统集成·企业cio联盟·企业级ai化转型