UVa Problem 10051

这题有点类似LIS,由于颜色最多100种,所以只需建立一个100的数组,按对立面的关系以某种颜色为向上面的最大值就可以了。
 
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 
 6 int cube[505][7];
 7 int max_col[105];
 8 int tmp_col[105];
 9 struct{
10     int p;
11     int wh;
12 } pre[505][7];
13 
14 struct c{
15     int p;
16     int wh;
17 }st_col[105],tmp_st[105];
18 int ans,ansc,answ;
19 
20 int main(){
21     int n; int T=0;
22     while(scanf("%d",&n),n){
23         for(int i=1;i<=100;i++)
24         st_col[i].p=st_col[i].wh=-1;
25         T++;
26         if(T>1) printf("
");
27         ans=answ=ansc=-1;
28         memset(max_col,0,sizeof(max_col));
29         for(int i=1;i<=n;i++){
30             for(int j=1;j<=6;j++)
31             scanf("%d",&cube[i][j]);
32         }
33         for(int i=n;i>=1;i--){
34             for(int j=1;j<=6;j++){
35                 tmp_col[cube[i][j]]=max_col[cube[i][j]];
36                 tmp_st[cube[i][j]]=st_col[cube[i][j]];
37             }
38             for(int k=1;k<=6;k++){
39                 if(k%2){
40                     if(tmp_col[cube[i][k]]+1>max_col[cube[i][k+1]]){
41                         max_col[cube[i][k+1]]=tmp_col[cube[i][k]]+1;
42                         if(ans<max_col[cube[i][k+1]]){
43                             ans=max_col[cube[i][k+1]];
44                             ansc=i;
45                             answ=k+1;
46                         }
47                         pre[i][k+1].p=tmp_st[cube[i][k]].p;
48                         pre[i][k+1].wh=tmp_st[cube[i][k]].wh;
49                         st_col[cube[i][k+1]].p=i;
50                         st_col[cube[i][k+1]].wh=k+1;
51                     }
52                 }
53                 else{
54                     if(tmp_col[cube[i][k]]+1>max_col[cube[i][k-1]]){
55                         max_col[cube[i][k-1]]=tmp_col[cube[i][k]]+1;
56                         if(ans<max_col[cube[i][k-1]]){
57                             ans=max_col[cube[i][k-1]];
58                             ansc=i;
59                             answ=k-1;
60                         }
61                         pre[i][k-1].p=tmp_st[cube[i][k]].p;
62                         pre[i][k-1].wh=tmp_st[cube[i][k]].wh;
63                         st_col[cube[i][k-1]].p=i;
64                         st_col[cube[i][k-1]].wh=k-1;
65                     }
66                 }
67             }
68         }
69         printf("Case #%d
",T);
70         printf("%d
",ans);
71         int p=ansc,pw=answ;
72         while(p!=-1){
73             printf("%d ",p);
74             if(pw==1){
75                 printf("front
");
76             }
77             if(pw==2) printf("back
");
78             if(pw==3) printf("left
");
79             if(pw==4) printf("right
");
80             if(pw==5) printf("top
");
81             if(pw==6) printf("bottom
");
82             int tp=p,tw=pw;
83             p=pre[tp][tw].p;
84             pw=pre[tp][tw].wh;
85         }
86     }
87     return 0;
88 }
View Code
原文地址:https://www.cnblogs.com/jie-dcai/p/3794524.html