首页/新闻资讯/正文详情

动态规划解LCS与LIS:算法详解与C++实现

发布时间:2026/11/8 7:45:42 来源:云帆数科 栏目:资讯中心
动态规划解LCS与LIS:算法详解与C++实现
1. 最长公共子序列LCS与最长递增子序列LIS概述在算法领域子序列问题一直是经典且实用的课题。最长公共子序列Longest Common Subsequence, LCS和最长递增子序列Longest Increasing Subsequence, LIS是两个密切相关但又各具特点的问题。LCS要解决的问题是给定两个序列找出它们共有的、最长的子序列。这里的子序列不需要连续只需要保持相对顺序。例如ABC和AC都是ABCD的子序列。LCS在文本相似度比较、版本控制、生物信息学中的DNA序列比对等领域有广泛应用。LIS则是针对单个序列寻找一个子序列使得元素严格递增且长度最长。比如序列[10, 9, 2, 5, 3, 7, 101, 18]的LIS是[2, 3, 7, 101]长度为4。LIS在任务调度、股票分析、路径规划等场景中都有重要应用。注意虽然LCS和LIS名称相似但它们是不同的问题。LCS处理两个序列的关系而LIS处理单个序列的性质。不过有趣的是它们可以通过动态规划这一共同的算法范式来解决。2. LCS问题详解与实现2.1 LCS的动态规划解法LCS的经典解法是动态规划其核心在于状态定义和状态转移方程。我们定义dp[i][j]表示序列A前i个元素和序列B前j个元素的LCS长度。状态转移方程分为两种情况当A[i] B[j]时dp[i][j] dp[i-1][j-1] 1当A[i] ! B[j]时dp[i][j] max(dp[i-1][j], dp[i][j-1])这个方程直观理解就是当当前元素匹配时LCS长度可以增加1当不匹配时我们需要考虑两种可能的前驱状态中的较大值。2.2 LCS的C实现#include iostream #include algorithm #include string using namespace std; int LCS(const string A, const string B) { int m A.length(), n B.length(); int dp[m1][n1] {0}; for (int i 1; i m; i) { for (int j 1; j n; j) { if (A[i-1] B[j-1]) { dp[i][j] dp[i-1][j-1] 1; } else { dp[i][j] max(dp[i-1][j], dp[i][j-1]); } } } return dp[m][n]; } int main() { string A ABCBDAB; string B BDCABA; cout LCS length: LCS(A, B) endl; return 0; }2.3 LCS的空间优化上述实现使用了O(mn)的空间实际上可以优化到O(min(m,n))。我们只需要保留当前行和上一行的数据即可int LCS_optimized(const string A, const string B) { if (A.length() B.length()) return LCS_optimized(B, A); int m A.length(), n B.length(); int prev[n1] {0}; int curr[n1] {0}; for (int i 1; i m; i) { for (int j 1; j n; j) { if (A[i-1] B[j-1]) { curr[j] prev[j-1] 1; } else { curr[j] max(prev[j], curr[j-1]); } } swap(prev, curr); } return prev[n]; }3. LIS问题详解与实现3.1 LIS的三种解法LIS问题有多种解法各有优缺点动态规划法时间复杂度O(n²)空间复杂度O(n)贪心二分法时间复杂度O(nlogn)空间复杂度O(n)转化为LCS法将原序列排序去重后与原序列求LCS3.2 动态规划解法定义dp[i]为以第i个元素结尾的LIS长度。状态转移方程为 dp[i] max(dp[j] 1) for all j i and nums[j] nums[i]int lengthOfLIS(vectorint nums) { int n nums.size(); vectorint dp(n, 1); int max_len 1; for (int i 1; i n; i) { for (int j 0; j i; j) { if (nums[j] nums[i]) { dp[i] max(dp[i], dp[j] 1); } } max_len max(max_len, dp[i]); } return max_len; }3.3 贪心二分法最优解维护一个数组tails其中tails[i]表示长度为i1的LIS的最小末尾元素。这个数组是单调递增的可以用二分查找优化。int lengthOfLIS_optimized(vectorint nums) { vectorint tails; for (int num : nums) { auto it lower_bound(tails.begin(), tails.end(), num); if (it tails.end()) { tails.push_back(num); } else { *it num; } } return tails.size(); }这种方法将时间复杂度降到了O(nlogn)是解决LIS问题的最优算法。4. 实际应用与变种问题4.1 LCS的应用场景文本相似度比较比较两段代码或文档的相似度版本控制系统Git等工具比较文件差异生物信息学DNA序列比对拼写检查寻找最接近的正确单词4.2 LIS的应用场景俄罗斯套娃信封问题二维的LIS问题最长递增路径矩阵中的最长递增路径任务调度寻找最多可以安排的不冲突任务股票分析寻找最长的价格上涨序列4.3 合唱队形问题这是一个经典的LIS变种问题要求找到一个位置使得左边是递增序列右边是递减序列。解法是对每个位置计算从左到右的LIS和从右到左的LDS最长递减子序列然后求和取最大值。int chorusFormation(vectorint heights) { int n heights.size(); vectorint lis(n, 1), lds(n, 1); // 计算从左到右的LIS for (int i 1; i n; i) { for (int j 0; j i; j) { if (heights[j] heights[i]) { lis[i] max(lis[i], lis[j] 1); } } } // 计算从右到左的LDS for (int i n-2; i 0; --i) { for (int j n-1; j i; --j) { if (heights[j] heights[i]) { lds[i] max(lds[i], lds[j] 1); } } } int max_len 0; for (int i 0; i n; i) { max_len max(max_len, lis[i] lds[i] - 1); } return n - max_len; }5. 常见问题与优化技巧5.1 LCS常见问题如何重建LCS而不仅仅是计算长度可以反向追踪dp表当A[i]B[j]时这个字符属于LCS然后移动到dp[i-1][j-1]否则移动到dp[i-1][j]和dp[i][j-1]中较大的那个。如何处理多个序列的LCS对于k个序列的LCS时间复杂度会上升到O(n^k)通常需要特殊的优化或近似算法。5.2 LIS常见问题如何重建LIS序列除了维护dp数组还需要维护一个parent数组记录前驱节点。如何处理非严格递增的LIS只需将比较条件从nums[j] nums[i]改为nums[j] nums[i]。5.3 性能优化技巧滚动数组优化对于LCS可以使用两行数组代替整个二维数组。离散化处理对于LIS如果数值范围很大可以先离散化。记忆化搜索有时递归记忆化的写法比迭代更直观。并行计算对于大规模数据可以考虑并行化部分计算。6. 算法扩展与进阶6.1 二维LIS问题如俄罗斯套娃信封问题需要先对一维排序然后在另一维上求LISint maxEnvelopes(vectorvectorint envelopes) { sort(envelopes.begin(), envelopes.end(), [](const auto a, const auto b) { return a[0] b[0] ? a[1] b[1] : a[0] b[0]; }); vectorint tails; for (const auto env : envelopes) { int h env[1]; auto it lower_bound(tails.begin(), tails.end(), h); if (it tails.end()) { tails.push_back(h); } else { *it h; } } return tails.size(); }6.2 带权值的LIS每个元素有权值求权值和最大的递增子序列int weightedLIS(vectorint nums, vectorint weights) { int n nums.size(); vectorint dp(weights.begin(), weights.end()); int max_sum dp[0]; for (int i 1; i n; i) { for (int j 0; j i; j) { if (nums[j] nums[i]) { dp[i] max(dp[i], dp[j] weights[i]); } } max_sum max(max_sum, dp[i]); } return max_sum; }6.3 分治解法对于某些特殊情况的LIS问题可以考虑使用分治法将问题分解为更小的子问题。在实际工程应用中选择哪种算法取决于具体场景和数据规模。对于小规模数据简单的动态规划就足够对于大规模数据则需要使用更高效的算法如贪心二分。

相关推荐

构建高效个性化图书推荐系统的实战指南
构建高效个性化图书推荐系统的实战指南

1. 项目概述作为一名在推荐系统领域深耕多年的技术从业者,我经常被问到如何从零开始构建一个真正有效的个性化图书推荐系统。不同于电商平台的商品推荐,图书推荐面临着独特的挑战:用户的阅读兴趣往往更加垂直且持久,图书的元数据&… · 2026/11/5 15:47:05

EasyDSS Windows免安装包:RTMP/HLS分发与NSSM服务化
EasyDSS Windows免安装包:RTMP/HLS分发与NSSM服务化

简介:面向 Windows 平台的 EasyDSS 流媒体视频管理安装包,适合需要在本地部署视频直播、点播与回放服务的企业运维人员、开发者及多媒体内容管理者。压缩包共收录 207 个文件,整体约 55.93MB,其中 js 与 css 构成 Web 管理界面&am… · 2026/11/5 2:11:26

漫剧制作全流程避坑指南:从版权规避到爆款运营
漫剧制作全流程避坑指南:从版权规避到爆款运营

做漫剧这个事,我前前后后也折腾了大半年,被平台限流过、被版权方警告过、也眼睁睁看着同期入局的人起号又注销号。如果你正准备进场,或者已经发了十几条作品但数据一直不温不火,这篇全流程避坑攻略就是按我自己踩过的坑反推出来的… · 2026/11/4 23:57:03

南充代审电工证怎么报名?学历不高怕报不上名?看这篇就够了
南充代审电工证怎么报名?学历不高怕报不上名?看这篇就够了

南充代审电工证怎么报名?学历不高怕报不上名?看这篇就够了 你是不是也担心自己学历不高,连个电工证都报不上?其实不然, 南充代审电工证 的报考门槛并不高,关键是要掌握正确的 怎么报名… · 2026/11/8 9:34:16

工地太忙根本没时间复习考试?电工证登记证怎么查询保姆级教程来了
工地太忙根本没时间复习考试?电工证登记证怎么查询保姆级教程来了

工地太忙根本没时间复习考试?电工证登记证怎么查询保姆级教程来了 工地太忙根本没时间复习考试,每天扛水泥、搭脚手架、盯进度,还得抽空准备电工证考试?你不是一个人。很多人在一线,干着技术活,想着考证却总是被现实绊住脚步。今天这篇【电工证登记证怎… · 2026/11/8 9:34:16

机修考低压电工证考前押题怎么准备?工地太忙根本没时间复习考试
机修考低压电工证考前押题怎么准备?工地太忙根本没时间复习考试

机修考低压电工证考前押题怎么准备?工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,这是很多机修工在考虑考低压电工证时的第一反应。特别是像你这样,在商丘从事建筑行业的工人,每天忙于施工、设备维护、机械运转,根本没有额外的时间去准备考试… · 2026/11/8 9:34:16

孝感市特种作业操作证网上查询如何高效备考?工地太忙根本没时间复习考试
孝感市特种作业操作证网上查询如何高效备考?工地太忙根本没时间复习考试

孝感市特种作业操作证网上查询如何高效备考?工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,这是很多一线特种作业人员的共同困扰。尤其是像孝感市这样的地方,特种作业操作证不仅是上岗的“通行证”,更是职业发展的“敲门砖”。但问题在于,很多… · 2026/11/8 9:34:16

孝感市特种作业操作证千万别踩坑,外省证能转吗?实操干货来了
孝感市特种作业操作证千万别踩坑,外省证能转吗?实操干货来了

孝感市特种作业操作证千万别踩坑,外省证能转吗?实操干货来了 之前考的证在外省能不能转过来?这是很多特种作业人员最关心的问题,尤其是在孝感市从事建筑、焊接、电工等行业的人,他们经常面临证书异地转换、年审流程复杂、操作不当被处罚等现实困境。… · 2026/11/8 9:34:16

特种作业在操作证报考条件你别被坑了 保姆级教程全在这
特种作业在操作证报考条件你别被坑了 保姆级教程全在这

特种作业在操作证报考条件你别被坑了 保姆级教程全在这 学历不高怕报不上名?特种作业在操作证这事儿,很多老铁都卡在这儿。别急,我在这儿给你捋清楚,别再被培训机构忽悠了,尤其像洛阳涧西区水利工程这些一线岗位,证书可是吃饭的家伙。这篇文章就是你找… · 2026/11/8 9:33:16

电工证丢失还能补吗?千万别踩坑,丢了证等于失业
电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/8 0:00:20

电力电缆作业证直播报名入口与办理流程良心建议
电力电缆作业证直播报名入口与办理流程良心建议

电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/8 0:00:20

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/8 0:00:20

电工证丢失还能补吗?千万别踩坑,丢了证等于失业
电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/8 0:00:20

电力电缆作业证直播报名入口与办理流程良心建议
电力电缆作业证直播报名入口与办理流程良心建议

电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/8 0:00:20

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/8 0:00:20

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 11:25:08

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 12:02:18

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/8 1:18:25

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码