这个题的状态转移方程本身还是很简单的,但是不是很容易想到
因为题目标明了每行数据都是1-n的排列
所以我们可以用dp[i]表示几组数据下标1-i范围的LCS
则很容易得到状态方程dp[j] = max(dp[i]+1, dp[j])(当前仅当每组数据中i都在j前面成立)
代码如下:
#include <bits/stdc++.h>
#define MAXN 1010
using namespace std;
int n, k;
int a[MAXN][MAXN], b[MAXN][MAXN], dp[MAXN];
bool judge(int x, int y) {
for(int i=2; i<=k; ++i) {
//不用从1开始是因为在调用该函数的循环中已经可以确定y在x后出现
if(b[i][x] > b[i][y] )
return false;
}
return true;
}
int main(void) {
scanf("%d%d", &n, &k);
for(int i=1; i<=k; ++i)
for(int j=1; j<=n; ++j) {
scanf("%d", &a[i][j]);
b[i][a[i][j]] = j;
}
for(int i=1; i<=n; ++i)
dp[i] = 1;
int ans = 0;
for(int i=1; i<=n; ++i) {
for(int j=i+1; j<=n; ++j) {
if(judge(a[1][i], a[1][j])) {
dp[j] = max(dp[i]+1, dp[j]);
//printf("dp[%d] = %d\n", j, dp[j]);
}
}
}
for(int i=1; i<=n; ++i)
ans = max(ans, dp[i]);
printf("%d\n", ans);
return 0;
}