- 题目描述
给定一个长度为N数组a和一个长度为M的数组b。请你求出它们的最长公共子序列长度为多少。
- 输入描述
输入第一行包含两个整数N,M,分别表示数组a和b的长度。
第二行包含N个整数a1,a2…an。
第三行包含M个整数b1,b2...bn。
1<=N,M<1000,1<ai,bi<1000000000。
- 输出描述
输出一行整数表示答案。
- 解题思路
1.采用动态规划(dp)思想,设置dp[i][j]数组:在数组a中的i个数与在数组b中的j个数的最长公共子序列长度
2.如果a[i]等于b[j],则在数组a中的i个数与在数组b中的j个数的最长公共子序列长度=在数组a中的i-1个数与在数组b中的j-1个数的最长公共子序列长度+1
3.else:a[i]不等于b[j],则数组a中的i个数与在数组b中的j个数的最长公共子序列长度=MAX(在数组a中的i-1个数与在数组b中的j数的最长公共子序列长度,在数组a中的i个数与在数组b中的j-1数的最长公共子序列长度)
- 代码模拟实现
#include<bits/stdc++.h>
using namespace std;
int a[1001];
int b[1001];
int dp[3000][3000];//dp[i][j]:在数组a中的i个数与在数组b中的j个数的最长公共子序列长度
int main()
{
int N,M;//表示数组a,b的长度
cin>>N>>M;
for(int i=1;i<=N;i++)
{
cin>>a[i];
}
for(int i=1;i<=M;i++)
{
cin>>b[i];
}
dp[0][0]=0;//初始化为0,因为在数组a中的0个数与在数组b中的0个数的最长公共子序列长度为0
dp[1][0]=0;//在数组a中的1个数与在数组b中的0数的最长公共子序列长度为0
dp[0][1]=0;//在数组a中的0个数与在数组b中的1个数的最长公共子序列长度为0
for(int i=1;i<=N;i++)//数组a[1]到a[N]
{
for(int j=1;j<=M;j++)//数组b[1]到b[M]
{
if(a[i]==b[j])
{
dp[i][j]=dp[i-1][j-1]+1;//如果a[i]等于b[j],则在数组a中的i个数与在数组b中的j个数的最长公共子序列长度=在数组a中的i-1个数与在数组b中的j-1个数的最长公共子序列长度+1
}else{//a[i]不等于b[j],则数组a中的i个数与在数组b中的j个数的最长公共子序列长度=MAX(在数组a中的i-1个数与在数组b中的j数的最长公共子序列长度,在数组a中的i个数与在数组b中的j-1数的最长公共子序列长度)
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
cout<<dp[N][M]<<endl;//在数组a中的N个数与在数组b中的M个数的最长公共子序列长度
return 0;
}
- 测试运行结果