题目链接:B-LIS & LCS
题目描述:
东东有两个序列A和B。
他想要知道序列A的LIS和序列AB的LCS的长度。
注意,LIS为严格递增的,即a1<a2<…<ak(ai<=1,000,000,000)。
Input:
第一行两个数n,m(1<=n<=5,000,1<=m<=5,000)
第二行n个数,表示序列A
第三行m个数,表示序列B
Output:
输出一行数据ans1和ans2,分别代表序列A的LIS和序列AB的LCS的长度
Sample Input:
5 5
1 3 2 5 4
2 4 3 1 5
Sample Output:
3 2
思路:
代码:
#include<iostream>
#include<string.h>
using namespace std;
const int maxn=1e4;
int n,m;
int A[maxn],B[maxn];
int arr1[maxn],arr2[maxn];
int dp[maxn][maxn];
int main(){
memset(dp,0,sizeof(dp));
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>A[i];
arr1[i]=1;
}
for(int i=0;i<m;i++)
cin>>B[i];
int now=1;
for(int i=0;i<n;i++){
for(int j=0;j<i;j++)
if(A[i]>A[j])
arr1[i]=max(arr1[i],arr1[j]+1);
now=max(arr1[i],now);
}
cout<<now<<" ";
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(A[i-1]==B[j-1])
dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);
else
dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
}
cout<<dp[n][m];
return 0;
}