【题意】给了n个立方体,并且给了每个面的颜色!并且给的顺序是按照质量由轻到重,这保证了我们的堆叠肯定是从上往下,且质量递增的。所以我们只需要保证下一个立方体的顶的颜色和上一个的底层相同就可以了。因此这是一个简单DAG上的最长路径问题!实际也可以用最长上升子序列的做法!
【AC代码】
#include <stdio.h> #include <string.h> #include <math.h> #include <iostream> #include <algorithm> using namespace std; const char temp[6][10] = {"front","back","left","right","top","bottom"}; struct node { int c[6]; } aa[502]; struct Node { int num,color; } box[502],save[502]; int answer,n; int dp[502][502]; void dfs(int id,int bottom,int num) { for(int i=id+1; i<=n; i++) { for(int j=0; j<6; j++) { if(id==0||(aa[i].c[j]==bottom&&dp[i][j]<num+1)) { dp[i][j] = num+1; if(j%2==1) { box[num].num = i; box[num].color = j; dfs(i,aa[i].c[j-1],num+1); } else { box[num].num = i; box[num].color = j; dfs(i,aa[i].c[j+1],num+1); } } } } if(answer<num) { answer = num; for(int i=0; i<num; i++) { save[i] = box[i]; } } } int main() { int cas=1; while(scanf("%d",&n)&&n) { for(int i=1; i<=n; i++) { for(int j=0; j<6; j++) { scanf("%d",&aa[i].c[j]); } } memset(dp,0,sizeof(dp)); answer = 0; dfs(0,0,0); printf("Case #%d\n",cas++); printf("%d\n",answer); for(int i=0; i<answer; i++) { printf("%d %s\n",save[i].num,temp[save[i].color]); } printf("\n"); } return 0; }