[C++]最長公共子序列問題
最長公共子序列問題:
給定兩個字符串s1s2···sn和t1t2···tn。求出這兩個字符串最長的公共子序列的長度。字符串s1s2···sn的子序列可以表示爲s(i1)s(i2)···s(in)(i1<i2<in)的序列
輸入格式:
n m
s
t
輸出格式:
最長子序列長度
輸入:
4 4
abcd
becd
輸出:
3
解題思路:當si+1等於tj+1,有三種情況,第一種是在s1··si與t1···tj的公共子序列末尾加上si+1,第二種是s1··sn與t1···ti+1的公共子序列,第三種是s1··si+1與t1···ti的公共子序列
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 10000;
int n;
int m;
string s, t;
int dp[maxn+1][maxn+1];
int main(){
cin>>n>>m;
cin>>s>>t;
for(int i = 0; i<n; i++){
for(int j = 0; j<m; j++){
if (s[i] == t[j]) {
dp[i+1][j+1] = dp[i][j] + 1;
}
else {
dp[i+1][j+1] = max(dp[i][j+1], dp[i+1][j]);
}
}
}
for(int i = 0; i<=n; i++){
for(int j = 0; j<=m; j++){
cout<<dp[i][j]<<" ";
}
cout<<endl;
}
cout<<dp[n][m]<<endl;
return 0;
}