首页 > 代码库 > Codeforces Round #264 (Div. 2) D
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\n",ans);
35 }
36 return 0;
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\n",ans);
35 }
36 return 0;
37 }
Codeforces Round #264 (Div. 2) D
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。