最長共通部分列(LCS)
問題の説明
2つの文字列(または数字のシーケンス)AとBが与えられた場合、この文字列がAとBの最も長い共通部分になるように文字列を見つけます(サブシーケンスは不連続になる可能性があります)
サンプル入力
悲しい話
管理者
サンプル出力
6
定義dp [i] [j]は、文字列s1の位置iと文字列s2の位置jの前の最長共通部分列の長さを表します。
状態遷移方程式:内1 [i] == s2 [j]時間、dp [i] [j] = dp [i-1] [j-1] + 1
注1 [i]!= s2 [j]時間、dp [i] [j] = max(dp [i-1] [j]、dp [i] [j-1])
#include <bits/stdc++.h>
using namespace std;
int main(){
string s1, s2;
getline(cin, s1);
getline(cin, s2);
int len1 = s1.length();
int len2 = s2.length();
int dp[len1+1][len2+1]; //因为状态转移方程-1,因此得从1开始
for(int i = 0; i <= len1; i++){ //并设定初始化
for(int j = 0; j <= len2; j++){
dp[i][j] = 0;
}
}
for(int i = 1; i <= len1; i++){
for(int j = 1; j <= len2; j++){
if(s1[i-1] == s2[j-1]){
dp[i][j] = dp[i-1][j-1] + 1;
}else{
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
}
cout<<dp[len1][len2];
return 0;
}