动态规划之最长公共子序列(LCS)

最长公共子序列(LCS)

问题描述

给定两个字符串(或数字序列)A和B,求一个字符串,使得这个字符串是A和B的最长公共部分(子序列可以不连续)

样例输入

sadstory

adminsorry

样例输出

6

定义dp[i][j]表示字符串s1的i号位与字符串s2的j号位之前的最长公共子序列长度
状态转移方程:

当s1[i] == s2[j]时,dp[i][j] = dp[i-1][j-1] + 1

当s1[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