好久没有刷过dp的题了,发现自己都快忘完了
给定两个字符串s和t,求这个两个字符串最长的公共子序列的长度。
这个问题也被称为LCS问题。
定义数组dp[MAX][MAX];
dp[i][j] 代表s的前i个和t的前j个的最长公共子序列的长度。
递推式如下:
当s[i] == t[j]时
d[i+1][j+1] = dp[i][j] + 1;
当s[i] != t[j]时
dp[i+1][j+1] = max(dp[i][j+1],dp[i+1][j]);
代码如下:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int MAX = 1010;
string s,t;
int dp[MAX][MAX];
void solve(){
int N = (int)s.length(),M = (int)t.length();
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]);
}
}
cout << dp[N][M] << endl;
}
int main(void){
cin >> s >> t;
solve();
return 0;
}