求两个字符串的最长公共子序列:
思想:
dp[i][j] 表示:a串中前i个元素 与 b中前j个元素中最长公共子序列长度
分两种情况:
1) a[i] == b[j] 则 dp[i][j] = dp[i-1][j-1]+1 它左上方+1,表示a(i-1)与b(i-1)最长的加一
2) a[i] != b[j] 则 dp[i][j] = 0
/***********************************************************
> File Name: 最长子序列.cpp
> Author: dulun
> Mail: dulun@xiyoulinux.org
> Created Time: 2016年04月19日 星期二 17时46分15秒
***********************************************/
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define LL long long
using namespace std;
const int N = 888;
char a[N];
char b[N];
int dp[N][N];
int main()
{
while(~scanf("%s%s", a+1, b+1))
{
memset(dp, 0, sizeof(dp));
int len_a = strlen(a+1);
int len_b = strlen(b+1);
int ans = 0;
for(int i = 1; i <= len_a; i++)
{
for(int j = 1; j <= len_b; j++)
{
if(a[i] == b[j]) dp[i][j] = dp[i-1][j-1] + 1;
else dp[i][j] = 0;
ans = max(ans, dp[i][j]);
}
}
printf("%d\n", ans);
}
return 0;
}