動的計画法の最長共通部分列(LCS)

最長共通部分列(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;
}

おすすめ

転載: blog.csdn.net/weixin_44723496/article/details/109058377