UVa 10051 - Tower of Cubes

题目:给你n个正方体,每个面有一种颜色,他们按照重量递增的方式排列着,现在要求把他们排成一个塔,

每层一个正方体,要求每个正方体上面的正方体的重量全都小于他,还要保证接触的面上的颜色相同,

问最高能摆放多少层,答案不唯一。

分析:dp,动态规划,lis。最大不下降子序列,已经排好序,满足接触的面颜色相同即可。

定义状态:f(i,k)为以第i个方块作为顶时,k面朝上时的最大高度;

转移方程:f(i,k)= max(f(j,f))  { j < i,且相接处的面相同 };

每个方块有6中摆放法式,利用一维数组压缩状态记录前驱,输出路径。

说明:去反面直接异或操作即可,好久没刷题了╮(╯▽╰)╭。

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;

int cubes[505][6];
int length[505][6];
int front[3333];

char face[6][7] = {"front", "back", "left", "right", "top", "bottom"};

void output(int space, int n)
{
	if (space) {
		printf("%d %s\n",n-space/6,face[space%6]);
		output(front[space], n);
	}
}

int main()
{
	int n,t = 0;
	while (~scanf("%d",&n) && n) {
		for (int i = n; i >= 1; -- i) {
			for (int j = 0; j < 6; ++ j) {
				scanf("%d",&cubes[i][j]);
			}
		}

		int max = 0,space = 0;
		for (int i = 1; i <= n; ++ i) {
			for (int k = 0; k < 6; ++ k) {
				length[i][k] = 1;
				front[6*i+k] = 0;

				for (int j = 1; j < i; ++ j) {
					for (int f = 0; f < 6; ++ f) {
						if (cubes[j][f] == cubes[i][k^1]
								&& length[j][f] >= length[i][k]) {
							length[i][k] = length[j][f]+1;
							front[6*i+k] = 6*j+f;
						}
					}
				}

				if (max < length[i][k]) {
					max = length[i][k];
					space = 6*i+k;
				}
			}
		}

		if (t ++) printf("\n");
		printf("Case #%d\n",t);
		printf("%d\n",max);
		output(space, n+1);
	}
    return 0;
}
时间: 2024-11-09 00:50:55

UVa 10051 - Tower of Cubes的相关文章

UVa 10051 Tower of Cubes(DP 最长立体堆叠)

 题意  给你n个立方体  立方体每面都涂有颜色  当一个立方体序号小于另一个立方体且这个立方体底面的颜色等于另一个立方体顶面的颜色  这个立方体就可以放在另一个立方体上面  求这些立方体堆起来的最大高度: 每个立方体有6种放置方式  为了便于控制  个人喜欢将一个立方体分解为6个  这样每个立方体只用考虑顶面和底面   d[i]表示分解后以第i个立方体为基底可以达到的最大高度  j从1到i-1枚举  当满足top[i]==bot[j]时  d[i]=max(d[i],d[j]+1) #in

UVa 10051 Tower of Cubes(DP 最长序列)

Problem A: Tower of Cubes  In this problem you are given N colorful cubes each having a distinct weight. Each face of a cube is colored with one color. Your job is to build a tower using the cubes you have subject to the following restrictions: Never

UVA 10051 --Tower of Cubes +dp

先将立方体按重量从大到小排序,然后就转成了类似于最长上升子序列的问题: 定义状态dp[i][j]表示以第i个立方体的第j面作为顶面时的最大高度. 则dp[i][j]=max(dp[k][d]+1;1<=k<=i-1,m[i][5-j]==m[d][k]) 注意为了方便后面的状态判定,我们在输入的时候要使得相对的面的坐标和为一个常数5. 对于路径输出,我们可以采用记录父节点的方法. 代码如下: #include<iostream> #include<cstring> #i

UVA 10733 - The Colored Cubes(Ploya)

UVA 10733 - The Colored Cubes 题目链接 题意:一个立方体.n种颜色,问能涂成多少不同立方体 思路:Ploya求解,正方体相应24种不同旋转一一计算出循环个数就可以.和 UVA 10601 - Cubes这题类似 代码: #include <stdio.h> #include <string.h> unsigned long long n; int main() { while (~scanf("%llu", &n) &

Codeforces 679B - Bear and Tower of Cubes

679B - Bear and Tower of Cubes 题目大意:一个数x定义一种拆分方式,每次拆分取最大的a 且 a^3<=x,x减去a^3,之后重复同样的操作,直到 x变为0.给你一个数m( m<=1e15 ),让你取一个数q<=m,q能执行的操作数在小于等于m的数里面最大,且在操作数 最大的里面,值是最大的. 感觉这种思维题就是特别难.... 思路:设a为当前小于等于m的最大立方数.则对于当前的 m 我们有两种情况要考虑,第一种是res1=m-a^3 第二种是不想减去a^3,

UVA - 10733 The Colored Cubes (置换)

All 6 sides of a cube are to becoated with paint. Each side is is coated uniformly with one color. When a selectionof n different colors of paint is available, how many different cubes can youmake? Note that any two cubes are onlyto be called "differ

UVA The Tower of Babylon

The Tower of Babylon Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of this tale have been forgotten. So now, in line with the educational nature of this contest, we will tell you the whole story: The babylonians

Uva 437-The Tower of Babylon(DP)

题目链接:点击打开链接 DAG上最长路. 题意:给出n种长方体,(每种无限),要求能摞的最大高度.连边是大的连小的. #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <string> #include <cctype> #include <vector> #include <cstdio&g

codeforces679B Bear and Tower of Cubes(思路)

题意: 给一个m<=10^15,每次都减最接近当前值的立方数 让你找一个不大于m的最大的数并且这个数是减法次数最多的数 思路: 每次有两种情况,一个是减去第一个不大于当前值的立方数 另一个是减去第二个不大于当前值的立方数 但是这时候当前数应变为下一个立方数-1-当前立方数 dfs求最优的解 /* *********************************************** Author :devil Created Time :2016/6/22 16:18:17 ******