博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态规划----最长公共子序列(C++实现)
阅读量:5099 次
发布时间:2019-06-13

本文共 1107 字,大约阅读时间需要 3 分钟。

最长公共子序列

  • 题目描述:给定两个字符串s1 s2 … sn和t1 t2 … tm 。求出这两个字符串的最长公共子序列的长度。字符串s1 s2 … sn的子序列指可以表示为s_{i1}s_{i2}s_{i k} { i1 < i2 < … < ik }的序列。
  • 输入样例

       2

       asdf
       adfsd
       123abc
       abc123abc

  • 输出样例

        3

        6

  • 解题思路:

这道题是被称为最长公共子序列的问题(LCS,Longest Common Subsequence)的著名问题。这道题我们是用动态规划的思想来做的。我们先拿第一组测试用例,asdf 与 adfsd 作为例子来看一下这道题的思路。上图!!

j / i 0 1(a) 2(s) 3(d) 4(f)
0 0 0 0 0 0
1(a) 0 1 1 1 1
2(d) 0 1 1 2 2
3(f) 0 1 1 2 3
4(s) 0 1 2 2 3
5(d) 0 1 2 2 3

做这种题,我们要用一个二维数组(dp[MAX_N][MAX_N])来存放每一个状态的值。如图所示,横向代表i、纵向代表j,那么,每一个网格的值是怎么来的呢。在这里我们把每一个状态即dp[i][j] 看做 s1 … si 和 t1 … tj 的LCS的长度。由此我们,s1 … s(i+1) 和 t1 … t(j+1) 对应的公共子列长度可能是:

当s(i+1) == t(j+1),在 s1 … si 和 t1 … tj 的公共子列末尾追加上s(i+1) 。

否则则可能是 s1 … si 和 t1 … t(j+1) 的公共子列或者 s1 … s(i+1) 和 t1 … tj 的公共子列最大值。

对应以下一个公式:

有了上面的公式我们就可以写代码了:

//最长公共子序列#include
#include
#include
#include
#define MAX 1001 using namespace std; int dp[MAX][MAX]; int main() { int N; cin >> N; while(N--) { string a,b; cin >> a >> b; memset(dp,0,sizeof(dp)); int len_a=a.size(),len_b=b.size(); for(int i=0;i

转载于:https://www.cnblogs.com/lesileqin/p/10322353.html

你可能感兴趣的文章
win7下把电脑设置成wlan热
查看>>
Java 多态 虚方法
查看>>
jquery.validate插件在booststarp中的运用
查看>>
java常用的包
查看>>
PHP批量覆盖文件并执行cmd命令脚本
查看>>
Unity之fragment shader中如何获得视口空间中的坐标
查看>>
支持向量机——内核
查看>>
MFC注册热键
查看>>
万能的SQLHelper帮助类
查看>>
uboot分析:uboot的启动过程分析
查看>>
tmux的简单快捷键
查看>>
springboot笔记04——读取配置文件+使用slf4j日志
查看>>
[Swift]LeetCode653. 两数之和 IV - 输入 BST | Two Sum IV - Input is a BST
查看>>
[Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II
查看>>
微信小程序的wxml文件和wxss文件在webstrom的支持
查看>>
Html5 离线页面缓存
查看>>
[php]在PHP中读取和写入WORD文档的代码
查看>>
WCF傻瓜模式写程序
查看>>
《绿色·精简·性感·迷你版》易语言,小到不可想象
查看>>
Java Web学习总结(13)Listener监听器
查看>>