51nod 1006 最长公共子序列Lcs
来源:互联网 发布:js多行文字溢出省略号 编辑:程序博客网 时间:2024/06/16 06:14
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示例
abcicbaabdkscab
Output示例
abca
分析:动态规划
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] , dp[i][j - 1]);
最大长度就是 dp[n][m] ,n 为A的长度,m为B的长度
还原字符串 ,只需要回到 dp[i][j] 刚开始发生改变的地方即可
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxn = 1E3 + 10;char a[maxn],b[maxn],ans[maxn];int dp[maxn][maxn];int main(){ scanf("%s%s",a + 1,b + 1); int n = strlen(a+1),m = strlen(b+1); memset(dp,0,sizeof(dp)); for(int i = 1 ; i <= n ; ++i){ for(int j = 1 ; j <= m ; ++j){ if(a[i] == b[j]){ dp[i][j] = dp[i-1][j-1] + 1; }else dp[i][j] = max(dp[i][j-1],dp[i-1][j]); } } int cur = 0; for(int i = n,j = m;dp[i][j];--i,--j){//返回到第一次更新值的地方 while(dp[i][j] == dp[i - 1][j]) --i; while(dp[i][j] == dp[i][j - 1]) --j; ans[cur++] = a[i]; } reverse(ans,ans+cur); ans[cur] = '\0'; printf("%s\n",ans); return 0;}
阅读全文
0 0
- 【51Nod】1006 - 最长公共子序列Lcs(LCS)
- 51nod 1006 最长公共子序列Lcs【LCS】
- lcs 51nod 1006 最长公共子序列Lcs
- 最长公共子序列Lcs 51Nod
- 最长公共子序列Lcs---51--Nod
- 51nod 1006 1006 最长公共子序列Lcs
- 51nod 1006:最长公共子序列Lcs
- 51Nod 1006 最长公共子序列Lcs(dp)
- 51Nod-1006-最长公共子序列Lcs
- [51nod]1006 最长公共子序列Lcs
- 51Nod 1006 最长公共子序列LCS DP水题
- 51Nod 1006 - 最长公共子序列(Lcs)
- 51nod 1006 最长公共子序列Lcs
- 51nod 1006 最长公共子序列Lcs
- 51Nod 1006 最长公共子序列Lcs
- 【51nod】1006 最长公共子序列Lcs
- 51Nod---1006-最长公共子序列Lcs
- 最长公共子序列(Lcs)51NOD-1006
- 二分法入门
- 使用json
- Android开发艺术探索__线程和线程池(十一)
- C++学习19:名称空间
- UVA 12219 Common Subexpression Elimination——map
- 51nod 1006 最长公共子序列Lcs
- sizeof与数组之间那点事
- 《软件测试的艺术》读书心得 ---一次自我评价测试
- jsp之编码、安装Browse Deployment Location插件、脚本片段、表达式、注释、声明
- sublime中文出现乱码怎么办?这里有办法
- iOS CollectionView刷新indexPath变化问题
- 173. Binary Search Tree Iterator
- HTML(三) 设置文字列表
- CRC16校验的学习