UVa 10051. Tower of Cubes

题意为一些重量递增而且各个面都有颜色的立方体,要将这些立方体堆成一个塔,要求两个接触面同色,而且下面的立方体更重。求塔的最大高度。

这题其实比较简单,就是数据太多,处理起来比较麻烦。

将每个立方体都分解成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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值