题意:
给n和k,然后给k个长度为n的1-n的排列
要求输出这k个排列的最长公共子序列长度
Examples
Input
4 3
1 4 2 3
4 1 2 3
1 2 4 3
Output
3
思路:
记录每个串每个数字的分别在自己所在串的位置
然后和普通的两个串求最长公共子序列差不多
更新的时候需要判断是否每个串的a(1,i)>a(1,j),只有这样才能更新(相对方向一致)
code:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
#define int long long
const int maxm=1e3+5;
const int K=10;
int a[K][maxm];
int pos[K][maxm];
int d[maxm];
int n,m;
signed main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
pos[i][a[i][j]]=j;//记录位置
}
}
for(int i=1;i<=n;i++){
d[i]=1;
for(int j=1;j<i;j++){
int ok=1;
for(int k=2;k<=m;k++){//判断2-m串每个串的合法性
if(pos[k][a[1][j]]>pos[k][a[1][i]]){//判断合法性
ok=0;
break;
}
}
if(ok){//如果合法则可以更新
d[i]=max(d[i],d[j]+1);
}
}
}
int ans=0;
for(int i=1;i<=n;i++){
ans=max(ans,d[i]);
}
cout<<ans<<endl;
return 0;
}