1.两个子序列:X={x1,x2....xm},Y={y1,y2....yn},设Z={z1,z2...zk}。

  2.最优子结构:

  1)如果xm=y,则zk=xm=yn且Zk-1是Xm-1和Yn-1的一个LCS。

  2)如果xm!=y,则zk!=xm包含Z是Xm-1和Y的一个LCS。

  3)如果xm!=y,则zk!=yn包含Z是X和Yn-1的一个LCS。

  3.则由最优子结构可得递归式:

  aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVoAAACGCAIAAAATuNXBAAANMElEQVR4nO2dvY8ctxmHp1QXd04/hVRF6qRS3VyVc2Ori0tnOwFBrPSGFOxfoC52IMjXO5JSBsgFcecAsSNVUhAgrYMo0s7ufPBlipdHUeQMl7Pk3Ozs/h5ccXs3H9wl+czLdzjLTAIAgJRSymzqAgAA9gXoAACggA4AAAroAACggA4AAAroAACggA4AAAroAACggA4AAAroAACggA4AAIrZ6+DFixd3796duhQAHALz1sHvvvzyxo0b3333NyKiqQsDwNyZqw7Kcn3nzp1ffPrpm7dlI0iQJJJQAgAxzFIHZbk+Pf3o8ddndUubWlSNaAQJBAgAxDE/HbALnjx9VrW0rsX6QgeIDgCIZGY6IJJFcfLk6R+1Cza1qFsSJKGCI+Hly5dZli2Xy6kLcoDMSQdE8uHDh5999st3cUFLKnEQcdjz8/PsgjzPkxUXjMMgHZydnenKLYpi7LKFs1wudcEWi8XUxVHMSQevXr26evXa67elHiO0PEaIOCY3l/Pzc36Z5zmMcDBwl3v58iW/3B8jLBaLLFNdj+22J0aYjQ5IyuLk5A9Pn5W1KGtRNdSmyBfkeW7WBEcK2g5g1lhBBKtf22EquP+fnZ3pv7C2JiySZi8KsRUi+Y/nz69eu7auRVm1m1o0bQIXuBUjnTYE9pCQOnLN3lnd5jE15jaLxaIoCh3bm7u4w5aQy4lrpf25CM1FB3Tv3m++uP+AQ4P4fAHD1eDqYE8iN9CH7oRmasBEOsNA2Z90sMJ1bhV6Mw7s+0YZRVGYo8vFYsEvzdSAlZmyhjCypx1Owgx0QCQFyQ8//Ok///XvUqcMUhy508rW8AHsISHRQefQoHNH3Yc7/2KO8/vOoptQSMHcoYE/bLlM5qADKVtBWZatKrFWoUGau4qIDmZKuA5CooOiKKyLv9ljXVm4heEGw81pa24C0UEURLJhHWzadS1aIVPNP0TuYKaEDBbCcweROtDhA2cZzCN0DhaQO4hCENWt0kHVUJt0xhHuLMyRQGVnYXcWtg4W/DrQlgm8wuPOwu5w4qBqBA8WNhdzDVLBNWGO/fbk1jTwEKgDvm5z//fc3rdyh1bH3qoDKWVRFDoqCYG37zz7tMxEB63KHVStengxIfs5Pwx4CO8/bATGswvLQmOGhyE6YIMMajzaIHuSNWCgAwBiOZgxJnQAQCzW7IP5Ah0AEMUhPWEJHQAAFNABAEABHQAAFNABAEABHQAAFNABAEABHQAAFNABAEABHQAAFNABAEABHQAAFNABAEABHQAAFNABAEABHQAAFNABAEABHQAAFNABAEABHQAAFNABAEABHQAAFNCBjV6FxVyHM35hDHehzkD04hw77HvYeKrGXa8VhHC8OuDG5C68s1wuze/MD9TB1jW5QnTA53JXhQtcGnjrcQ6MVDoIXKnpGDhSHXALMJuLfmnpYCvmmm4xRdKrdEXqwHMc4GKumLJXyyVOwjHqwH/BH6QDfajIRXh17OAuLi57dMB/HHSc48RToe5iaiErMh4wx6gD/xJaVutxl9/u28uvg77VxN2yxejAf5wDw1M1Vj/XA0NrM7fWAqvJXyS9dmvIAk3uuGbC9d2PUQd5nnu6CnQwF8J1YP7R/NB4zGhuE5+DNI+ga8FaIdrKWGXvr/6c5/lUK4kfow4y79rb0MFcGKoDhiuCq9gdGiRZi5nDz/BAw7TStItBQwc2Hh3oLJ17hEE6yPO8L5W9VQdm5tK9zviPc2DspgP+ALUOkkcH0ogFAu9Pm8msoZnstByjDpA7OAyG6oCrwPzQkucOzLO7SQSPxPUANs/zCW9tHKMOuBH0XQGgg7kQn0rcemdBx2KDCsaD/0GBBm+cREYxJNCBnsXBVvPMtzFjMx0w+z+vkeYdcNhvnjrP8855BzE6MHOW0EFyrKrpG4H7w+88z/V/dZ/U/91BB2ZL8MehFnyiaWttwPvUsRajW+disTDfQ6AO5EV1TqID6QzC+2Yl+nVgTW1k9MbhOujMCOiNw6ch+Y9zYATqYCtmKsfaZagOrCkt1n1HP1z++OnwMYS+T76c6obF75NfWjoIZ1od9JEql2M11pg4cOgk5ePEvD+XMD/vj8ISMuF0A03Q6f2jIOigE+tjiZnuBh1shZuofpmwaxVFcTm5vfA4YsQyhGzkn7djtXvPZdCqpL3VAceHkXWjPwQ9oNgtDjz4mD8JRVHwx6tz+En68NnZ2eV00T15BDNIB/6+cWA6AOBo2a6DrfOux9WBlK0g6ACAS2C/dHD79m03Ma5ZbVroAIDx2KPcAUkpSLaC6paai5+6FVUjVlWbZdnbTbtpBHQAwEgE6YDviPalspLogEgSyUZQ1YiyFmXVlpUoK1HWYlWJ/62VDqpGtIKgAwDGIPRmDE/VMDt537wDSwdmZOHTgZSCqG5pXYtV1eqft5v27aZ9XTZZlr1Zt1VD0AEAIzHg3qz5lXJZ/6zE3XQgpaSLkULViM27H1rX4s2mzbLsDaIDAMYkzTMLfZkFa2be1twBEXH6oCUpSKUSmpbKWmRZtqqQSgRgRMbVgfUv67mazhuNRJKk8UPUkqwagRuNAIxN+ica3zv6xahBP/5kPuBt/aUTTEMC4NI4xu87AAB0Ah0AABTQAQBAAR0AABTQAQBAAR0AABTQAQBAAR0AABTQAQBAAR0AABTQAQBAAR0AABTQAQBAAR0AABTQAQBAAR0AABTQAQBAAR0AABTQAQBAAR0AcNnwlwbneT51QWygg7FYLBaBa4Fb3z3LXz8fv3x7URS6wcWsCq8XpNdH8y/SF34c7hUx79SzgCifTn+p/14BHezIGDpwv9bZRHfOmFN0fme8Pq9/3ZoQHYS0J1MH8qJ7+A+rv946yzLtMnfHEB3wu3A76nK5NEtVFEWgNDtJpQMurfXGRyXLsh2UOjbHq4O+Ns3/itSB1eillEVRmJ3KvDB6FqroRAtr0OXFrwP+r9kTdHQT4hEL3bW26oDrIvzIY8CfJ//O9XIJRoAOdmE8HXRehPU1LbKN5nluNik+Y9+KEoN0oA+1WCwS6sBzwR+qAx2VhOjAWqdrJDzScQsQX/shXFoYMojj1UHndSDP8+Vy6TaIziA/z3OzZese5bYwf3QdvgS2tZdfB9YGnl7tt5W7o7WaVh8hOpCOOofSN1iwaoFfup+A+2nz+/WvBuSnr2FY28TrwD1y36cRyFHrwOr2fX+3xvlWJszM//Hf3fbkvxRMrgN/tmJsHQQebdBZZE/c4UrBfe/xOci+hmHCF56Qo1lLJTP8iVmFD2w5Ho5aB1aL0WktT7hohZ28pdWArFrxpLuYyXVgDp5dxtbB0FFPyFmkdxii73HIrrpOMn7pbBgmRVHEXMYZq2lFilUeuQ6kMdA17wV0rjTdOV6QF9l48+JvOTtGB2aq3zrCPuhA96vOODxcB56zb2UHHehbPHKc6IBxG4ZJURRJMibW7eTIYx67Djozc27krxuce+nmhuVmy8PvzE0eHUybO7jM6ED7yxNgx+cOdMGyFJMLPIMFadRdkns0s9HBlStXfny9Sq4DeZHUMZuOqQPrU7b25aZsXf/d9sTH7+vhk+vAf3ftMHIHfanErXcWdCgxaEze2TBGghtw5AwOZiY6aOjjT+589ejrMXSgp6DoDdzogJuL1aTMbm/GnJ3XJQ4drbCic95BjA7MXu3XQWcWyhry9M072Ns7C3214L9y8pQQ/t0KBuVOOuhrGNYGqWYl6gacIKJJUqBRESSrRnz16PHHn9ypGtEKSqsD99poXR/MKWvmvtZe5u2lziZuRX19sxL9OrCmNlrtYGcdSCdF4pmV6NcB9y4TsxjJ5x2E6GArZpmtXXbQgadhMGl1kHDK8wx0QCQbQf95vfrJBx/8981KkNz/Rxbca6CHobMS+7AGKX4dhIfoO0cHnYw6K9EsWMIJTvHPVoxNZyC2y3HiDzE2RNQIKmvxq19//sX9B42g2PBgfDqfWegjlQ6s0aMVoZi9etBEQ3fjmMaX9pkFE6uc8TfhNeFPo01Cqmfe5Dx0oMYL9OPr1c+uX//+h+dzEMLuTzTuBguIf9ejG91ErBHKYrEIP5f5JGLM811jPNFoYr4pa7wTw/n5+R4+XGCy2wOmncxAB1JKQVS3Yl2LP/35Lzdv3nq7KmfgAwDmxjx0QEStoKqhsha/f/T456enq3INHwCQlrnoQAqipqV1LcpKfPPk6enpR6uyRIgAQELmoQMpJUnZCqpbWtdiXYtvnjy7fuPGX7/9FkIAIBWz0YF8N2QQbIS///D85q1bn9+7V5bl1EUD4BCYkw6klETvxQibRtx/8NuTkxOayRcoArDPzE8HlhHWtagaIUjiXgMAkcxMB1IZgQTJuqVNI8pabGrRCJrFZAQA9pn56YDhPEIjqGpE1YimhQ4AiGWuOpBS0kUqQZDEYAGAeGasA4b0D2wAQByz1wEAIBXQAQBAAR0AABTQAQBAAR0AABTQAQBAAR0AABTQAQBAAR0AABTQAQBA8X+LIR+Udn/0lAAAAABJRU5ErkJggg==" alt="" />

  4.实现:

 #include<string>
#include<iostream>
using namespace std; int arr[][] = {};
void LCS(string str1, string str2){
int len1 = str1.length();
int len2 = str2.length();
//边界
for (int i = ; i <= len1; i++)
arr[i][] = ;
for (int j = ; j <= len2; j++)
arr[][j] = ;
//检验
for (int i = ; i <= len1; i++)
{
for (int j = ; j <= len2; j++)
{
if (str1[i - ] == str2[j - ]) //记录
{
arr[i][j] = arr[i - ][j - ] + ;
}
else if (arr[i][j - ] >= arr[i - ][j])
{
arr[i][j] = arr[i][j - ];
}
else
{
arr[i][j] = arr[i - ][j];
}
}
}
} void printLCS(string str1, string str2,int len1, int len2){
cout << "最长公共子序列长为:" << arr[len1][len2] << endl;
//倒序输出
while (len1&&len2){
if (str1[len1-]==str2[len2-])
{
cout << str1[len1 - ];
len1--;
len2--;
}
else if (arr[len1][len2-]>=arr[len1-][len2])
{
len2--;
}
else{
len1--;
}
}
cout << endl;
} int main()
{
string str1 = "abcdsnnnn";
string str2 = "acbdanm";
LCS(str1, str2);
printLCS(str1, str2,str1.length(), str2.length());
return ;
}

动态规划二:最长公共子序列(LCS)的更多相关文章

  1. 动态规划之最长公共子序列LCS(Longest Common Subsequence)

    一.问题描述 由于最长公共子序列LCS是一个比较经典的问题,主要是采用动态规划(DP)算法去实现,理论方面的讲述也非常详尽,本文重点是程序的实现部分,所以理论方面的解释主要看这篇博客:http://b ...

  2. 动态规划之最长公共子序列(LCS)

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

  3. C++版 - Lintcode 77-Longest Common Subsequence最长公共子序列(LCS) - 题解

    版权声明:本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - L ...

  4. 编程算法 - 最长公共子序列(LCS) 代码(C)

    最长公共子序列(LCS) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定两个字符串s,t, 求出这两个字符串最长的公共子序列的长度. 字符 ...

  5. 1006 最长公共子序列Lcs

    1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdks ...

  6. POJ 1458 Common Subsequence(最长公共子序列LCS)

    POJ1458 Common Subsequence(最长公共子序列LCS) http://poj.org/problem?id=1458 题意: 给你两个字符串, 要你求出两个字符串的最长公共子序列 ...

  7. 51Nod 1006:最长公共子序列Lcs(打印LCS)

    1006 最长公共子序列Lcs  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...

  8. 51nod 1006 最长公共子序列Lcs 【LCS/打印path】

    1006 最长公共子序列Lcs  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...

  9. 每日一题-——最长公共子序列(LCS)与最长公共子串

    最长公共子序列(LCS) 思路: 代码: def LCS(string1,string2): len1 = len(string1) len2 = len(string2) res = [[0 for ...

  10. 51nod 1006:最长公共子序列Lcs

    1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...

随机推荐

  1. poj 2155 Matrix (树状数组)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 16797   Accepted: 6312 Descripti ...

  2. SRM710 div1 ReverseMancala(trick)

    题目大意, 给定一个有n个点的环,n不超过10,每个点上有一个权重 起始时权重将会给出,然后有2种操作 第一种操作是,选择一个位置i,获得权重w = a[i],把a[i]变成0,然后接下来在环上顺着走 ...

  3. [Leetcode] Reorder list 重排链表

    Given a singly linked list L: L 0→L 1→…→L n-1→L n,reorder it to: L 0→L n →L 1→L n-1→L 2→L n-2→… You ...

  4. BZOJ2120 数颜色 【带修改莫队】

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MB Submit: 6579  Solved: 2625 [Submit][Status][Discus ...

  5. oracle 包和包实现

    包: create or replace package sp_pexam_clear as --定义结构体 /*type re_stu is record( rname student.name%t ...

  6. 转:Spring AOP详解

    转:Spring AOP详解 一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址: ...

  7. netty学习指南

    这段时间领导让我熟悉Socket开发,我花了三周时间左右去学习相关的知识,包括Java socket开发,重点学习了netty这个异步非阻塞通信框架. 在这里把我学习过程中遇到的有用资料整理了,供大家 ...

  8. Ubuntu下修改NAT模式的IP地址

    1,查看虚拟机的网段 在编辑->虚拟网络编辑器->NAT设置->网关 IP  可以查看到虚拟机的网关 如图 2,图形化设置: 图中 Netmask设置的是255.255.255.0 ...

  9. [BZOJ2946] [Poi2000]公共串解题报告|后缀数组

    给出几个由小写字母构成的单词,求它们最长的公共子串的长度. 单词个数<=5,每个单词长度<=2000     尽管最近在学的是SAM...但是看到这个题还是忍不住想写SA... (其实是不 ...

  10. [BZOJ1005]Prufer数列+排列组合

    一棵树的Prufer数列 每次在剩下的树中找到标号最小的叶子节点(对于无根树而言即是度数为1的节点),删去. 同时将其父节点(即与其相连的唯一点)加入Prufer数列当中. 一个Prufer数列所对应 ...