caioj1068 最長公共子序列LCS

題目描述

給出兩個字符串 S1 和 S2 求它們最長公共子序列的長度。 
什麼是最長公共子序列呢? 
    比如:
        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;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章