LCS 求最长公共子序列 dp
来源:互联网 发布:淘宝模版如何制作 编辑:程序博客网 时间:2024/06/07 01:34
【1】求最长公共子序列 要求可以不连续 不输出,只求长度;
#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<string>#include<cmath>#include<vector>using namespace std;#define N 100000int s[10000][1000];char a[100],b[100];int LCS(){ int i,j; for(i=0; i<=strlen(a); i++) { s[i][0]=0; // puts("****"); } for(j=0; j<=strlen(b); j++) { s[0][j]=0; } for(i=1; i<=strlen(a); i++) { for(j=1; j<=strlen(b); j++) { if(a[i-1]==b[j-1]) { s[i][j]=s[i-1][j-1]+1; } else { if(s[i-1][j]>=s[i][j-1]) { s[i][j]=s[i-1][j]; } else if(s[i-1][j]<s[i][j-1]) { s[i][j]=s[i][j-1]; } } // printf("%d %d %d\n",s[i][j],i,j); } } return s[strlen(a)][strlen(b)];//}int main(){ scanf("%s",a); scanf("%s",b); int len=LCS(); cout<<len<<endl;}
【2】输出长度
用一个二维数组进行标记:
#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<string>#include<cmath>#include<vector>using namespace std;#define N 100000int s[10000][1000];char a[100],b[100];int vis[10000][1000];int LCS(){ int i,j; for(i=0; i<=strlen(a); i++) { s[i][0]=0; // puts("****"); } for(j=0; j<=strlen(b); j++) { s[0][j]=0; } for(i=1; i<=strlen(a); i++) { for(j=1; j<=strlen(b); j++) { if(a[i-1]==b[j-1]) { s[i][j]=s[i-1][j-1]+1; vis[i][j]=1; } else { if(s[i-1][j]>=s[i][j-1]) { s[i][j]=s[i-1][j]; vis[i][j]=2; } else if(s[i-1][j]<s[i][j-1]) { s[i][j]=s[i][j-1]; vis[i][j]=3; } } } } return s[strlen(a)][strlen(b)];//}void printstring(int i,int j){ if(i==0||j==0) { return ; } else { if(vis[i][j]==1) { printstring(i-1,j-1); printf("%c ",a[i-1]); } else if(vis[i][j]==2) { printstring(i-1,j); } else { printstring(i,j-1); } }}int main(){ scanf("%s",a); scanf("%s",b); int len=LCS(); cout<<len<<endl; printstring(strlen(a),strlen(b));}
【3】求最长子串
要求必须连续,不输出串,只输出长度;
#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<string>#include<cmath>#include<vector>using namespace std;#define N 100000int s[10000][1000];char a[100],b[100];int vis[10000][1000];int LCS(){ int i,j; int len=0; for(i=0; i<=strlen(a); i++) { s[i][0]=0; } for(j=0; j<=strlen(b); j++) { s[0][j]=0; } for(i=1; i<=strlen(a); i++) { for(j=1; j<=strlen(b); j++) { if(a[i-1]==b[j-1]) { s[i][j]=s[i-1][j-1]+1; if(len<s[i][j]) { len=s[i][j]; } } else { s[i][j]=0; } } } return len;}int main(){ scanf("%s",a); scanf("%s",b); int len=LCS(); cout<<len<<endl;}
【4】求最长子串,输出
#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<string>#include<cmath>#include<vector>using namespace std;#define N 100000int s[10000][1000];char a[100],b[100];int vis[10000][1000];int LCS(){ int i,j; int len=0; for(i=0; i<=strlen(a); i++) { s[i][0]=0; } for(j=0; j<=strlen(b); j++) { s[0][j]=0; } for(i=1; i<=strlen(a); i++) { for(j=1; j<=strlen(b); j++) { if(a[i-1]==b[j-1]) { s[i][j]=s[i-1][j-1]+1; if(len<s[i][j]) { len=s[i][j]; } vis[i][j]=1; } else { s[i][j]=0; } } } return len;}void printstring(int i,int j){ if(i==0||j==0) { return ; } else { if(vis[i][j]==1) { printstring(i-1,j-1); printf("%c ",a[i-1]); } else { printstring(i-1,j-1); } }}int main(){ scanf("%s",a); scanf("%s",b); int len=LCS(); cout<<len<<endl; printstring(strlen(a),strlen(b));}
阅读全文
0 0
- LCS 求最长公共子序列 dp
- DP—求最长公共子序列LCS(代码)
- 求最长公共子序列(LCS)
- 求最长公共子序列(LCS)
- 求最长公共子序列LCS
- 最长公共子序列 LCS DP
- DP 最长公共子序列 LCS
- DP---LCS 最长公共子序列问题
- DP之最长公共子序列 LCS
- 最长公共子序列(LCS DP)
- 最长公共子序列LCS(DP)
- 最长公共子序列LCS-DP
- ACM DP 最长公共子序列Lcs
- 最长公共子序列Lcs (dp)
- 51nod oj 1006 最长公共子序列【dp+前向记录求Lcs】
- DP(求最长公共子序列)
- LCS:最长公共子序列
- LCS---最长公共子序列
- 【干货索引】阿里云大数据计算服务MaxCompute与生态系统的融合
- 谈一谈对象
- react-native 新闻标签排序编辑功能
- Error: "title_activity_hi" is translated here but not found in default locale [ExtraTranslation]
- vue的笔记
- LCS 求最长公共子序列 dp
- Android中AIDL的工作原理
- vim 使用
- 实际使用 工厂模式+适配器模式
- linux 中 xargs、cut 以及管道综合应用
- Android 开发之漫漫长途Ⅰ—Android 系统的创世之初以及 Activity 的生命周期
- js的null和undefined的区别-js基本数据类型
- HQL常用函数
- 骑士共存问题