题目描述
给出两个字符串 S1 和 S2 求它们最长公共子序列的长度。
什么是最长公共子序列呢?
比如:
S1:='abbccdss'
S2:='aeebfcaadb'
那么S1和S2的最长公共子序列就是:"abcd". 这个说明最长公共子序列强调位置的前后关系不变,但不在乎是否连续。另外 最长公共子序列不唯一。
输入格式:
读入两行,分别是S1和S2( 长度不大于1000)。
输出格式:
输出一个整数。即为最长公共子序列的长度。
什么是最长公共子序列呢?
比如:
S1:='abbccdss'
S2:='aeebfcaadb'
那么S1和S2的最长公共子序列就是:"abcd". 这个说明最长公共子序列强调位置的前后关系不变,但不在乎是否连续。另外 最长公共子序列不唯一。
输入格式:
读入两行,分别是S1和S2( 长度不大于1000)。
输出格式:
输出一个整数。即为最长公共子序列的长度。
输入
输出
样例输入
abbccdss
aeebfcaadb
样例输出
4
关键:构造二维dp
#include<bits/stdc++.h>
using namespace std;
template <typename T> void read(T &x){
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
for(;isdigit(ch);ch=getchar())x=(x<<1)+(x<<3)+ch-'0';
x*=f;
}
string a,b;
int len1,len2;
int f[1001][1001];
void debug(){
for(int i=1;i<=len1;++i){
for(int j=1;j<=len2;++j) cout<<f[i][j]<<" ";
cout<<endl;
}
}
int main(){
cin>>a>>b;
memset(f,0,sizeof(f));
len1=a.length();
len2=b.length();
/*cout<<a<<" "<<b<<endl;
cout<<len1<<" "<<len2<<endl;*/
for(int i=1;i<=len1;++i){
for(int j=1;j<=len2;++j){
if(a[i-1]==b[j-1]) f[i][j]=f[i-1][j-1]+1;
else f[i][j]=max(f[i-1][j],f[i][j-1]);
//debug();
}
}
cout<<f[len1][len2]<<endl;
return 0;
}