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("\n"); 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\n",T); 70 printf("%d\n",ans); 71 int p=ansc,pw=answ; 72 while(p!=-1){ 73 printf("%d ",p); 74 if(pw==1){ 75 printf("front\n"); 76 } 77 if(pw==2) printf("back\n"); 78 if(pw==3) printf("left\n"); 79 if(pw==4) printf("right\n"); 80 if(pw==5) printf("top\n"); 81 if(pw==6) printf("bottom\n"); 82 int tp=p,tw=pw; 83 p=pre[tp][tw].p; 84 pw=pre[tp][tw].wh; 85 } 86 } 87 return 0; 88 }