您的位置:首页 > 编程语言 > C语言/C++

LCS最长公共子序列S,P

2017-02-09 22:09 218 查看
。俩字符串 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]
就是最大值

这个栗子 asb 长度3

完整马

#include <iostream>
#include <cstring>
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 嗯 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LCS dp C++