题意为一些重量递增而且各个面都有颜色的立方体,要将这些立方体堆成一个塔,要求两个接触面同色,而且下面的立方体更重。求塔的最大高度。
这题其实比较简单,就是数据太多,处理起来比较麻烦。
将每个立方体都分解成6个不同面朝上的立方体,这里只需将立方体的上下两面颜色和重量记下就行,然后再dp,在打印路径时递归打印即可。
#include <iostream>
#include <cstdio>
#include <string.h>
#include <cmath>
using namespace std;
char face[6][10] ={ "front","back", "left", "right", "top", "bottom"};
//dp用来记录最大高度,p记录该立方体的上面的立方体的编号,cu存6个面的颜色
//top,bot记录立方体的上下两面的颜色,num记录重量,df记录那个面位于top位置
int dp[3001],p[3001],cu[6],top[3001],bot[3001],num[3001],df[3001];
int n, m;
void printpath( int k) //递归打印路径
{
if( k==-1)
return ;
printpath( p[k] );
printf("%d %s\n",num[k], face[df[k]]);
}
int main()
{
int t=1,first =1;
while( scanf("%d", &n)==1 && n)
{
if( !first)
printf("\n");
else
first =0;
m=0;
int i,j;
for( i=0; i<n; i++)
{
for( j=0; j<6; j++)
scanf("%d",&cu[j]);
for( j=0; j<6; j++) //分解为6个立方体
{
df[m] =j;
num[m] =i+1;
top[m] =cu[j];
if( j%2)
bot[m] =cu[j-1];
else
bot[m] =cu[j+1];
m++;
}
}
memset( dp, 0, sizeof( dp));
memset( p, -1, sizeof( p));
for( i=0; i<m; i++)
for( j=i+1; j<m; j++)
if( num[j]> num[i] && bot[i] ==top[j] && dp[j]< dp[i]+1)
{
dp[j] =dp[i]+1; p[j] =i;
}
int max =0,k=0;
for( i=1; i<m; i++)
if( dp[i]>max)
{
max =dp[i];
k =i;
}
printf("Case #%d\n%d\n",t++,max+1);
printpath(k );
}
return 0;
}