51nod 1006 最长公共子序列Lcs(dp+string,无标记数组实现)

1006 最长公共子序列Lcs

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题

收藏

关注

取消关注

给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。

比如两个串为:

abcicba

abdkscab

ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。

Input

第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)

Output

输出最长的子序列,如果有多个,随意输出1个。

Input示例

abcicba
abdkscab

Output示例

abca

设dp[i][j]表示字符串a的前i个字符与字符串b的前j个字符的最长公共子序列长度。状态转移方程:dp[i][j]=a[i-1]==b[j-1]?dp[i-1][j-1]+1:max(dp[i-1][j],dp[i][j-1]);边界条件dp[0][x]=dp[x][0]=0;

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 int dp[1005][1005]={0};
 5 string a,b;
 6 int la,lb;
 7 void lcs(int n,int m)
 8 {
 9     for(int i=1;i<=n;i++)
10         for(int j=1;j<=m;j++)
11         dp[i][j]=a[i-1]==b[j-1]?dp[i-1][j-1]+1:max(dp[i-1][j],dp[i][j-1]);
12 }
13 void output()
14 {
15     string ans;
16     int i=la,j=lb,len=dp[la][lb];
17     while(dp[i][j])
18     {
19         if(a[i-1]==b[j-1])
20             ans.push_back(a[i-1]),i--,j--;
21         else if(dp[i][j]==dp[i-1][j])
22             i--;
23         else if(dp[i][j]==dp[i][j-1])
24             j--;
25     }
26     for(int i=len-1;i>=0;i--)
27         cout<<ans[i];
28     cout<<endl;
29 }
30 int main()
31 {
32     ios::sync_with_stdio(false);
33     cin>>a>>b;
34     la=a.size(),lb=b.size();
35     lcs(la,lb);
36     output();
37     return 0;
38 }

时间: 2024-10-20 01:25:02

51nod 1006 最长公共子序列Lcs(dp+string,无标记数组实现)的相关文章

[2016-05-09][51nod][1006 最长公共子序列Lcs]

时间:2016-05-09 21:12:54 星期一 题目编号:[2016-05-09][51nod][1006 最长公共子序列Lcs] 题目大意:[2016-05-09][51nod][1006 最长公共子序列Lcs].md 分析:动态规划 dp[i][j] 表示字符串A以第i个位置 ,字符串B以第j个位置的最长公共子序列的长度 dp[i][j] = dp[i - 1][j - 1] + 1 if a[i] == a[j] else dp[i][j] == max(dp[i - 1][j] ,

51Nod - 1006 最长公共子序列Lcs模板

给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列. Input 第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000)Output输出最长的子序列,如果有多个,随意输出1个. Sample Input abcicba abdkscab Sample Output abca 只能求最长公共子序列的长度,不能输出这个串是什么

51Nod 1006 最长公共子序列Lcs

给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列. Input 第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000) Output 输出最长的子序列,如果有多个,随意输出1个. Input示例 abcicba abdkscab Output示例 abca 1 #include <stdio.h> 2 #defin

1006 最长公共子序列Lcs

1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列. Input 第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000) Output 输出最长的子序列,如果有多个,随意输出1个. Input示例 abcicba abdkscab Outpu

1006 最长公共子序列Lcs(经典动态规划)

传送门 Description 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列. Input 第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000) Output 输出最长的子序列,如果有多个,随意输出1个. Sample Input abcicba abdkscab Sample Output abca 思路 记:Xi

最长公共子序列LCS (DP)

题意: 求两个字符串的公共子序列,如"abcd" 与 "becd"的公共子序列是 "bcd" 分析: 设两个字符串为 串s 和串tdp[i][j]:= s1..si和t1...tj对应的LCS长度 那么 dp[i][j] = { 0                     ,   i =0 or j = 0; dp[i-1][j-1] + 1,   i ,j > 0 and si = tj; max(dp[i-1][j] , dp[i][j

LCS 最长公共子序列(DP经典问题)

最长公共子序列问题以及背包问题都是DP(动态规划)算法的经典题目,值得深度挖掘以致了解DP算法思想.问题如下: 最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列. tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最

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

POJ1458 Common Subsequence(最长公共子序列LCS) http://poj.org/problem?id=1458 题意: 给你两个字符串, 要你求出两个字符串的最长公共子序列长度. 分析: 本题不用输出子序列,非常easy,直接处理就可以. 首先令dp[i][j]==x表示A串的前i个字符和B串的前j个字符的最长公共子序列长度为x. 初始化: dp全为0. 状态转移: IfA[i]==B[j] then dp[i][j]= dp[i-1][j-1]+1 else dp[

序列最的问题之最长公共子序列LCS

在程序设计竞赛中,我们时常会遇到序列求最值的问题.在讲今天的问题之前,先小小的说明一下,子序列与子串的问题. 子序列:在原序列中不一定连续: 子串:在原序列中必须连续. 接下来,就开始今天要讲的最长公共子序列LCS(Longest Common Subsequence).对于LCS这一类的问题,一般是相对于两个序列而言,str[]与ch[].先假设str的长度为n,ch的长度为m.假设str[]="ASBDAH",ch[]="SDAAH";其中"SDA&q