Codeforces Round #264 (Div. 2) D

题意: 给出最多5个序列,问这几个序列的最长公共子序列的长度是多少。

solution : 脑抽级别我是,第一个序列每个数字位置固定,这样只要维护一个k-1维的偏序集就好了。然后在保证每个位置合法的情况下

走一遍最长上升子序列就好了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int inf = 0x3f3f3f3f;
 4 const int MAX = 1000+10;
 5 int a[MAX],x;
 6 int dp[MAX];
 7 int L[10][MAX];
 8 int main() {
 9     int n,k;
10     while(scanf("%d %d",&n,&k)==2) {
11         for(int i=1;i<=n;i++) {
12             scanf("%d",&a[i]);
13         }
14         for(int i=1;i<k;i++) {
15             for(int j=1;j<=n;j++) {
16                 scanf("%d",&x);
17                 L[i][x]=j;
18             }
19         }
20         memset(dp,-1,sizeof(dp));
21         bool  flag ;
22         for(int i=1;i<=n;i++) {
23             dp[i]=1;
24             for(int j=1;j<i;j++) {
25                 flag=true;
26                 for(int m=1;m<k;m++) {
27                     if(L[m][a[i]]<L[m][a[j]]) flag = false;
28                 }
29                 if(flag) dp[i]=max(dp[i],dp[j]+1);
30             }
31         }
32         int ans=-inf;
33         for(int i=1;i<=n;i++) ans=max(ans,dp[i]);
34         printf("%d ",ans);
35     }
36     return 0;

37 } 

原文地址:https://www.cnblogs.com/acvc/p/3946845.html