最长公共子序列问题
来源:互联网 发布:超市毛利率算法 编辑:程序博客网 时间:2024/06/14 09:21
输入
第1行:字符串A第2行:字符串B(A,B的长度 <= 1000)
输出
输出最长的子序列,如果有多个,随意输出1个。
输入示例
abcicbaabdkscab
输出示例
abca
#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;char s1[1000],s2[1000];int len1,len2,dp[1000][1000],mark[1000][1000];void LCS(){ int i,j; memset(dp,0,sizeof(dp)); for(i = 0;i<=len1;i++) mark[i][0] = 1;//对于前一个字符串所有标记为1; for(i = 0;i<=len2;i++) mark[0][i] = -1;//第二个字符串标记为-1; for(i = 1; i<=len1; i++) { for(j = 1; j<=len2; j++) { if(s1[i-1]==s2[j-1]) { dp[i][j] = dp[i-1][j-1]+1; mark[i][j] = 0;//第一个字符串i位置,与第二个字符串j位置相等,标记为零 } else if(dp[i-1][j]>=dp[i][j-1]) { dp[i][j] = dp[i-1][j]; mark[i][j] = 1;//s2[j-1]已重 } else { dp[i][j] = dp[i][j-1]; mark[i][j] = -1;//s2[j-1]无重 } } }}void PrintLCS(int i,int j)//回溯输出 { if(!i && !j) return ; if(mark[i][j]==0) { PrintLCS(i-1,j-1); printf("%c",s1[i-1]); } else if(mark[i][j]==1) { PrintLCS(i-1,j); } else { PrintLCS(i,j-1); }}int main(){ while(~scanf("%s%s",s1,s2)) { len1 = strlen(s1); len2 = strlen(s2); LCS(); PrintLCS(len1,len2); printf("\n"); } return 0;}
0 0
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- hdu 4283 You Are the One(区间dp)
- OC中的Data
- 通过反射获取静态常量字段的值
- 每隔2个数删除一个数的删数问题
- 利用Viewpager+Timer实现图片广告轮播
- 最长公共子序列问题
- 51NOD--动态规划
- PHP菜鸟进阶--php中的可变变量
- 国内镜像下载Android源码
- Android Studio(一):快捷键
- oralce 日期操作
- JQuery 操作Tbale
- 用fidder 抓取安卓手机的网络连接包
- Python标准库——time