最长公共子序列
- 题目链接:最长公共子序列
题目描述:
现在给出两个序列X和Y,你的任务是找到X和Y的最大公共子序列,
也就是说要找到一个最长的序列Z,使得Z既是X的子序列也是Y的子序列。
- 思路:见注释
#include<bits/stdc++.h>
#define maxn 1005
#define INF 0x3f3f3f3f
#define mst(a) memset(a,0,sizeof a)
#define ll long long
using namespace std;
//题号:2000:最长公共子序列
char A[maxn],B[maxn];
//dp[i][j] 表示前缀子串A[1-i]与B[1-j]的 最长公共子序列
int dp[maxn][maxn];
int main()
{
// 从A[1] 、B[1]开始写入
while(scanf("%s%s",A+1,B+1)!=EOF)
{
// 开始时 A不取,B取一个, 最长公共子序列等于0
//反之 A取一个,B不取, 最长公共子序列等于0
dp[0][1] = 0;dp[1][0] = 0;
int lenA = strlen(A+1),lenB = strlen(B+1);
for(int i = 1; i<=lenA; i++)
for(int j = 1; j<=lenB; j++)
{ //当A[i] != B[j],时dp[i][j]的状态由max(dp[i-1][j],dp[i][j-1])转移过来
dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
if(A[i]==B[j])dp[i][j] = max(dp[i][j],dp[i-1][j-1]+1);
}
cout << dp[lenA][lenB] << endl;
}
return 0;
}