題目描述
什麼是最長公共子序列呢?
比如:
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;
}