LCS最长公共子序列S,P

。俩字符串 S 和 P 求最长公共子序列。

把他们当成矩阵

dp[][]与i j关系

dp[0][0]=0

if S[i]=P[j]   dp[i] [j] =dp[i-1][j-1]+1

else dp[i] [j] =MAX(dp[i-1][j], dp[i],j-1])

就这么几个。也算记忆的数组。然后dp[m][n]就是最大值

这个栗子 asb 长度3


完整马

#include 
#include 
using namespace std;
int dp[111][111] = { 0 };
char s[111] = "a111s111b111";
char p[111] = "aggfhgsfhb";
char sub[111] = {};
int num = 0;
int Max(int a, int b)
{
	return a > b ? a : b;
}
void LCS(const char*s, const char* p)
{
	for (int i = 0; i < strlen(s); i++)
	{
		for (int j = 0; j < strlen(p); j++)
		{
			if (s[i] == p[j])
			{
				sub[num++] = s[i];//这里是把相同的存入这个子序列 可以打印出来看看结果
				dp[i + 1][j + 1] = dp[i][j] + 1;
			}
			else dp[i + 1][j + 1] = Max(dp[i][j + 1], dp[i + 1][j]);
		}
	}
}

int main()
{
	LCS(s, p);
	for (int i = 1; i <= strlen(s); i++)
	{
		for (int j = 1; j <=strlen(p); j++)
			cout << dp[i][j] << " ";
		cout << endl;
	}
	cout << dp[strlen(s)][strlen(p)];
	cout << endl  << sub;
	cin.get();
}
打印出 asb 嗯 

你可能感兴趣的:(算法,基础,C++,LCS,dp,C++)