题目大意:给出N个正方体,正方体的重量由轻到重,轻的必须放在重的上面,而且上面的那一个正方体的底部颜色必须与其下面的那一块的顶部颜色相同,求最多能叠几个正方体,并输出堆叠时正方体上面的颜色
解题思路:用dp[i][j]表示第i个j面朝上时能堆叠几个,那么就可以得到转换方程了,dp[i][j]=max(dp[k][l])+1,dp[k][l]转换时的判断条件要注意,如果j面朝上的话,那么他的相反面就必须和k的l面的颜色相同
#include<cstdio>
#include<cstring>
#define maxn 505
int cube[maxn][6],N,dp[maxn][6],path[maxn][6][2];
char color[6][10] = {"front","back","left","right","top","bottom"};
int main() {
int mark = 1,bo = 1;
while(scanf("%d", &N) != EOF && N) {
if(bo)
bo = 0;
else
printf("\n");
memset(dp,0,sizeof(dp));
for(int i = 1; i <= N; i++)
scanf("%d%d%d%d%d%d",&cube[i][0],&cube[i][1],&cube[i][2],&cube[i][3],&cube[i][4],&cube[i][5]);
printf("Case #%d\n",mark++);
int max = 0,first[2];
for(int i = N; i >= 1; i--)
for(int j = N; j > i; j--)
for(int k = 0; k < 6; k++)
for(int l = 0; l < 6; l++)
if(cube[i][k] == cube[j][l]) {//如果第I个的下面的颜色等于第J个的上面的的颜色
int temp1;
if(k % 2 == 0)
temp1=k+1;
else
temp1=k-1;
int temp3 = dp[j][l] + 1;
if(dp[i][temp1] < temp3) {
dp[i][temp1] = temp3;
path[i][temp1][0] = j;
path[i][temp1][1] = l;
if(max < dp[i][temp1]) {
max = dp[i][temp1];
first[0] = i;
first[1]= temp1;
}
}
}
printf("%d\n",max+1);
int m,n;
for(int i = first[0],j = first[1],k = 1; k <= N; k++, m = path[i][j][0],n = path[i][j][1],i = m,j = n) {
if(i != 0) {
printf("%d %s\n",i,color[j]);
}
}
}
return 0;
}