入门 - 最长公共子序列 Lcs
2017-05-17 13:06
204 查看
1006 最长公共子序列Lcs
基准时间限制:1 秒 空间限制:131072 KB 分值: 0
难度:基础题
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:
abcicba abdkscab
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
Input
Output
Input示例
Output示例
首先确定方程类型,二维方程 dp[i][j]=k 表示以字符串A第i个字符和字符串B第j个字符结尾的最长公共子串长度为k;
dp[i+1][j+1]=max(dp[i+1][j] ,dp[i][j+1] , dp[i][j]+1)
表示A串i+1个和B串j个取最长,A串i个和B串j+1个取最长
如果a[i]==b[j],就是取dp[i+1][j+1]=dp[i][j]+1;
代码如下:
基准时间限制: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]=k 表示以字符串A第i个字符和字符串B第j个字符结尾的最长公共子串长度为k;
dp[i+1][j+1]=max(dp[i+1][j] ,dp[i][j+1] , dp[i][j]+1)
表示A串i+1个和B串j个取最长,A串i个和B串j+1个取最长
如果a[i]==b[j],就是取dp[i+1][j+1]=dp[i][j]+1;
代码如下:
#include <iostream> #include <stdio.h> #include <string.h> #include <string> using namespace std; const int ma=1005; int dp[ma][ma]; int main() { string a,b,ans; while(cin>>a>>b) { int lena=a.length(),lenb=b.length(),cur=0; ans=""; for(int i=0;i<lena;++i) for(int j=0;j<lenb;++j) { if(a[i]==b[j]) dp[i+1][j+1]=dp[i][j]+1; else dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]); } int i=lena-1,j=lenb-1; while(i>=0&&j>=0) { if(a[i]==b[j]) { ans=a[i]+ans; --i; --j; } else { if(dp[i][j+1]>dp[i+1][j]) --i; else --j; } } cout<<ans<<endl; } return 0; }
相关文章推荐
- 动态规划入门之最长公共子序列(LCS)
- LCS最长公共子序列入门题
- 算法导论,动态规划 —— 最长公共子序列问题(LCS)优化python示例
- POJ 1458 Common Subsequence 最长公共子序列(LCS)
- 基于DP的LCS(最长公共子序列)问题
- 动态规划求解最长公共子序列(LCS)
- 动态规划(一)最长公共子序列问题 LCS 总结
- LCS最长公共子序列~dp学习~4
- LCS问题(最长公共子序列)-动态规划实现
- 动态规划 LCS 求两个序列A,B中所有的最长公共子序列
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
- 最长公共子序列问题LCS
- LCS算法[动态规划 最长公共子序列]求回文串
- 编程之美3.3——类似——两个字符串的最长公共子序列(LCS)
- 程序员编程艺术第十一章:最长公共子序列(LCS)问题
- 动态规划算法解最长公共子序列LCS问题
- LCS之最长公共子序列
- 最长公共子序列(LCS)
- L - Common Subsequence POJ 1458 (动态规划,LCS 最长公共子序列 )
- 最长公共子序列问题(LCS, Longest Common Subsequence)