思路:

既然是动态规划,还是要从小问题的解推导出大问题的解这个思路入手。

而且强烈建议画表来理解这个思路!

令 d p [ i ] [ j ] dp[i][j] dp[i][j]为str1 [ 0 , . . . , i ] [0, ..., i] [0,...,i]与 s t r 2 [ 0 , . . . , j ] str2[0, ..., j] str2[0,...,j]的最长公共子序列,则:

W h e n s t r 1 [ i ] = s t r 2 [ j ] , d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + 1 , W h e n s t r 1 [ i ] ≠ s t r 2 [ j ] , d p [ i ] [ j ] = max ⁡ ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] ) . When \quad str1[i] = str2[j], \quad dp[i][j] = dp[i - 1][j - 1] + 1, \\ \quad\\ When \quad str1[i] \neq str2[j], \quad dp[i][j] = \max(dp[i-1][j], dp[i][j-1]). \\ Whenstr1[i]=str2[j],dp[i][j]=dp[i−1][j−1]+1,Whenstr1[i]​=str2[j],dp[i][j]=max(dp[i−1][j],dp[i][j−1]).

在初始化的时候,我们将 d p dp dp的长度设置成 ( s t r 1 l e n + 1 ) ∗ ( s t r 2 l e n + 1 ) (str1_len+1)*(str2_len+1) (str1l​en+1)∗(str2l​en+1),这样就可以预留了一个可以设置为0的边界,即:

W h e n i = 0 o r j = 0 , d p [ i ] [ j ] = 0. When \quad i = 0 \quad or \quad j = 0, \quad dp[i][j] = 0. Wheni=0orj=0,dp[i][j]=0.

源代码:

//
//  main.cpp
//  LongestCommonSubsequence
//
//  Created by 胡昱 on 2021/11/11.
//#include <iostream>
using namespace std;// 计算字符串长度的函数
// 因为作业网站中的编译器不支持strlen()故需要重写
int my_strlen(const char s[])
{int i = 0;if(s == NULL)return 0;while(s[i] != '\0')++i;return i;
}int main(int argc, const char * argv[]) {// 共m个问题int m = 0;cin >> m;while((m--) > 0) {// 输入两个字符串const int N = 500;char s1[N], s2[N];cin >> s1 >> s2;int s1l = my_strlen(s1);int s2l = my_strlen(s2);// 创建动态规划数组// dp[i][j]代表了s1[1, ..., i]与s2[1, ..., j]的最长子序列长度int** dp = new int*[s1l + 1];for(int i = 0; i < s1l + 1; ++i) {dp[i] = new int[s2l + 1];}// 初始化动态规划数组(把边界设置为0)for(int i = 0; i < s1l + 1; ++i) {dp[i][0] = 0;}for(int j = 1; j < s2l + 1; ++j) {dp[0][j] = 0;}// 开始动态规划for(int i = 1; i < s1l + 1; ++i) {for(int j = 1; j < s2l + 1; ++j) {// 当s1[i]与s2[j]相等时if(s1[i - 1] == s2[j - 1]) {dp[i][j] = dp[i - 1][j - 1] + 1;}// 当不相等时else {dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);}}}// 输出结果cout << dp[s1l][s2l] << endl;// 释放资源for(int i = 0; i < s1l + 1; ++i) {delete [] dp[i];}delete [] dp;}
}

C++实现求解最长公共子序列(LCS)问题【动态规划】相关推荐

  1. python实现求解最长公共子序列LCS问题

    在实现论文<Automatically Generating Models for Botnet Detection>论文的算法中,用到了一个The longest commom subs ...

  2. 算法导论-----最长公共子序列LCS(动态规划)

    目录 一.概念梳理 二.最长公共子序列解决方案 方案1:蛮力搜索策略 方案2:动态规划策略 三.C代码实现 实现1 实现2(空间优化) 一.概念梳理   1. 子序列(subsequence): 一个 ...

  3. 最长公共子序列LCS(动态规划)—详解

    一.基本概念 1. 子序列(subsequence): 一个特定序列的子序列就是将给定序列中零个或多个元素去掉后得到的结果(不改变元素间相对次序).例如序列<A,B,C,B,D,A,B>& ...

  4. 【51NOD】1006 最长公共子序列Lcs(动态规划)

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最 ...

  5. 动态规划算法解最长公共子序列LCS问题

    动态规划算法解LCS问题 作者 July 二零一零年十二月三十一日 本文参考:微软面试100题系列V0.1版第19.56题.算法导论.维基百科. 第一部分.什么是动态规划算法 ok,咱们先来了解下什么 ...

  6. 程序员编程艺术第十一章:最长公共子序列(LCS)问题

    程序员编程艺术第十一章:最长公共子序列(LCS)问题 0.前言 程序员编程艺术系列重新开始创作了(前十章,请参考程序员编程艺术第一~十章集锦与总结).回顾之前的前十章,有些代码是值得商榷的,因当时的代 ...

  7. 算法之最长公共子序列(LCS)问题

    算法课上老师留的作业,最长公共子序列LCS(Longest Common Subsequence)问题,首先看到这个问题感觉有点复杂,和最长公共子串不同,公共子序列并不要求元素相邻,看起来只有穷举才能 ...

  8. 最长公共子序列php,动态规划(最长公共子序列LCS)

    概念 求解决策过程最优化的结果 (可能有多个) 把多阶段过程转化为一系列单阶段过程,利用各阶段之间的关系,逐个求解 计算过程中会把结果都记录下,最终结果在记录中找到. 举例 求两个字符串的最长公共子序 ...

  9. 动态规划表格法解决最长公共子序列(LCS)问题

    3.5 最长公共子序列(LCS) 前言:图片是博主自己画的,转载请注明出处哦 3.5.1 问题描述 最长公共子序列(Longest Common Subseuence,LCS)问题:给定两个字符串,求 ...

  10. 动态规划解最长公共子序列(LCS)(附详细填表过程)

    目录 相关概念 子序列形式化定义: 公共子序列定义: 最长公共子序列(以下简称LCS): 方法 蛮力法求解最长公共子序列: 动态规划求解最长公共子序列: 分析规律: 做法: 伪代码: 下面演示下c数组 ...

最新文章

  1. Linux线程-互斥锁pthread_mutex_t
  2. 清华大学计算机图形学课程
  3. 给Teams消息附加图片的三种方式
  4. Spring @Repository批注
  5. BZOJ 1715: [Usaco2006 Dec]Wormholes 虫洞
  6. 西门子PLC丨虚拟机运行仿真器供物理主机使用
  7. 发卡行 收单行 收单
  8. delphi信封打印程序
  9. gridcontrol 添加行删除行
  10. 好物推荐 | 小明医声家庭健康初体验
  11. iOS企业版app部署到自己的服务器
  12. 金仓数据库KingbaseES初始化失败如何分析
  13. 程序Crash(奔溃)记录和分析工具——Crashlytics
  14. K210 Mx-yolov3模型训练和物体识别
  15. 数字连连看java实验报告,Java语言实现数字连连看源码
  16. IPC 进程间通讯,排队输出--day33
  17. 17年,除了代码收入还有房子收入
  18. 三门问题(Monty Hall problem)背后的贝叶斯理论
  19. Silverlight5 做的打印用针式打印机打印时,为什么非常不清楚?
  20. Java怎么计算百分比?

热门文章

  1. 基于ESP8266的太空人智能时钟
  2. 程序员专业常用英语词汇
  3. 自然场景文字检测方案总结
  4. 心流体验:与挑战颉颃的乐趣
  5. 如何使用百度天气预报API接口
  6. 8款最好用的固定资产管理软件
  7. Hive使用必知必会系列
  8. linux iptables mac,mac下的iptables---pfctl
  9. 洛谷 P5594 【XR-4】模拟赛 记录
  10. 江西省信息技术知识竞赛