LCIS
Problem Description
Alex has two sequences
a1,a2,...,an
and
b1,b2,...,bm
. He wants find a longest common subsequence that consists of consecutive values in increasing order.
Input
There are multiple test cases. The first line of input contains an integer
T
, indicating the number of test cases. For each test case:
The first line contains two integers n and m (1≤n,m≤100000) -- the length of two sequences. The second line contains n integers: a1,a2,...,an (1≤ai≤106) . The third line contains n integers: b1,b2,...,bm (1≤bi≤106) .
There are at most 1000 test cases and the sum of n and m does not exceed 2×106 .
The first line contains two integers n and m (1≤n,m≤100000) -- the length of two sequences. The second line contains n integers: a1,a2,...,an (1≤ai≤106) . The third line contains n integers: b1,b2,...,bm (1≤bi≤106) .
There are at most 1000 test cases and the sum of n and m does not exceed 2×106 .
Output
For each test case, output the length of longest common subsequence that consists of consecutive values in increasing order.
Sample Input
3 3 3 1 2 3 3 2 1 10 5 1 23 2 32 4 3 4 5 6 1 1 2 3 4 5 1 1 2 1
Sample Output
1 5 0
题意:给出两个序列,求最长公共递增序列。
题解:关键是递增,所以dp[ i ] =max ( dp[ i-1 ]+1,dp[ i ] ).
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,t,m,a[101010],b[101010],dp1[101010],dp2[101010];
int main(){
scanf ("%d",&t);
while (t--){
int i;
scanf ("%d %d",&n,&m);
memset(dp1,0,sizeof(dp1));
memset(dp2,0,sizeof(dp2));
for (i=1; i<=n; i++)
scanf ("%d",&a[i]);
for (i=1; i<=m; i++)
scanf ("%d",&b[i]);
for (i=1;i<=n;i++){
dp1[a[i]]=max(dp1[a[i]],dp1[a[i]-1]+1);
}
for (i=1;i<=m; i++){
dp2[b[i]]=max(dp2[b[i]],dp2[b[i]-1]+1);
}
int ans=0;
for (i=1; i<=n; i++){
ans=max(ans,min(dp1[a[i]],dp2[a[i]]));
}
printf ("%d\n",ans);
}
return 0;
}