题目连接:10051 - Tower of Cubes

题目大意:有n个正方体,从序号1~n, 对应的每个立方体的6个面分别有它的颜色(用数字给出),现在想要将立方体堆成塔,并且上面的立方体的序号要小于下面立方体的序号,相邻的面颜色必须相同。输出最高值和路径。

解题思路:因为立方体可以旋转,所以一个序号的立方体对应这6种不同的摆放方式,可以将问题理解成DAG最长路问题, 只是搜索范围是从i + 1开始到n。然后记录路径要开两个2维数组。

路径不唯一,随便输出一条。

  1. #include <stdio.h>
  2. #include <string.h>
  3. const int N = 1005;
  4. const int M = 10;
  5. const char sign[M][10]= {"front", "back", "left", "right", "top", "bottom"};
  6.  
  7. struct state {
  8. int in;
  9. int out;
  10. }tmp[N][M];
  11. int n, x[N][M], y[N][M], dp[N][M];
  12.  
  13. void Init() {
  14. memset(tmp, 0, sizeof(tmp));
  15. memset(dp, 0, sizeof(dp));
  16. memset(x, 0, sizeof(x));
  17. memset(y, 0, sizeof(y));
  18. }
  19.  
  20. void write(int k, int a, int b, int d) {
  21. tmp[d][k].in = a;
  22. tmp[d][k].out = b;
  23. }
  24.  
  25. void read() {
  26. int a, b;
  27. for (int i = 1; i <= n; i++) {
  28. for (int j = 0; j < 3; j++) {
  29. scanf("%d%d", &a, &b);
  30. write(j * 2, a, b, i);
  31. write(j * 2 + 1, b, a, i);
  32. }
  33. }
  34. }
  35.  
  36. int search(int d, int k) {
  37. if (dp[d][k]) return dp[d][k];
  38.  
  39. for (int i = d + 1; i <= n; i++) {
  40. for (int j = 0; j < 6; j++) {
  41. if (tmp[i][j].in == tmp[d][k].out) {
  42. int a = search(i, j);
  43. if (a > dp[d][k]) {
  44. dp[d][k] = a;
  45. x[d][k] = i, y[d][k] = j;
  46. }
  47. }
  48. }
  49. }
  50. return ++dp[d][k];
  51. }
  52.  
  53. void solve() {
  54. int Max = 0, idx, idy, a;
  55. for (int i = 1; i <= n; i++) {
  56.  
  57. if (Max + i >= n) break;
  58.  
  59. for (int j = 0; j < 6; j++) {
  60. a = search(i, j);
  61. if (a > Max) {
  62. Max = a;
  63. idx = i, idy = j;
  64. }
  65. }
  66. }
  67. printf("%d\n", Max);
  68.  
  69. for (int i = 0; i < Max; i++) {
  70. printf("%d %s\n", idx, sign[idy]);
  71. a = idx;
  72. idx = x[idx][idy];
  73. idy = y[a][idy];
  74. }
  75.  
  76. /*
  77. printf("%d\n", dp[1][5]);
  78. idx = 1; idy = 5;
  79. for (int i = 0; idx; i++) {
  80. printf("%d %s\n", idx, sign[idy]);
  81. a = idx;
  82. idx = x[idx][idy];
  83. idy = y[a][idy];
  84. }
  85. */
  86. }
  87.  
  88. int main() {
  89. int cas = 0;
  90. while (scanf("%d", &n), n) {
  91. Init();
  92.  
  93. read();
  94.  
  95. if (cas) printf("\n");
  96.  
  97. printf("Case #%d\n", ++cas);
  98.  
  99. solve();
  100. }
  101. return 0;
  102. }

uva 10051 Tower of Cubes(DAG最长路)的更多相关文章

  1. uva 10131 Is Bigger Smarter?(DAG最长路)

    题目连接:10131 - Is Bigger Smarter? 题目大意:给出n只大象的属性, 包括重量w, 智商s, 现在要求找到一个连续的序列, 要求每只大象的重量比前一只的大, 智商却要小, 输 ...

  2. 简单Dp----最长公共子序列,DAG最长路,简单区间DP等

    /* uva 111 * 题意: * 顺序有变化的最长公共子序列: * 模板: */ #include<iostream> #include<cstdio> #include& ...

  3. NYOJ16 矩形嵌套(DAG最长路)

    矩形嵌套 紫书P262 这是有向无环图DAG(Directed Acyclic Graph)上的动态规划,是DAG最长路问题 [题目链接]NYOJ16-矩形嵌套 [题目类型]DAG上的dp & ...

  4. 「BZOJ1924」「SDOI2010」 所驼门王的宝藏 tarjan + dp(DAG 最长路)

    「BZOJ1924」[SDOI2010] 所驼门王的宝藏 tarjan + dp(DAG 最长路) -------------------------------------------------- ...

  5. BZOJ 5450 轰炸 (强连通缩点+DAG最长路)

    <题目链接> 题目大意: 有n座城市,城市之间建立了m条有向的地下通道.你需要发起若干轮轰炸,每轮可以轰炸任意多个城市.但每次轰炸的城市中,不能存在两个不同的城市i,j满足可以通过地道从城 ...

  6. UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索

    题意:给出几个多维的箱子,如果箱子的每一边都小于另一个箱子的对应边,那就称这个箱子小于另一个箱子,然后要求能够套出的最多的箱子. 要注意的是关系图的构建,对箱子的边排序,如果分别都小于另一个箱子就说明 ...

  7. The Largest Clique UVA - 11324( 强连通分量 + dp最长路)

    这题  我刚开始想的是  缩点后  求出入度和出度为0 的点  然后统计个数  用总个数 减去 然而 这样是不可以的  画个图就明白了... 如果  减去度为0的点  那么最后如果出现这样的情况是不可 ...

  8. 02_嵌套矩形(DAG最长路问题)

    来源:刘汝佳<算法竞赛入门经典--训练指南> P60 问题2: 问题描述:有n个矩形,每个矩形可以用两个整数a,b描述,表示它们的长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中的条件 ...

  9. BZOJ1093 [ZJOI2007]最大半连通子图 【tarjan缩点 + DAG最长路计数】

    题目 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意 两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G ...

随机推荐

  1. 【测试Json的多空格问题】

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. Silverlight中的拖拽实现的图片上传

    原文 http://blog.csdn.net/dujingjing1230/article/details/5443003 在Silverlight中因为可以直接从系统的文件夹里面拖出来一个文件直接 ...

  3. ISSkin Pack 3.0 (含预览程序 ISSkinViewer)

    原文 http://restools.hanzify.org/article.asp?id=108 包含 250 款皮肤, 预览程序纯粹的由Inno Setup脚本写成. 足以展示Inno Setup ...

  4. poj 1887 Testing the CATCHER_最长上升子序列

    题意:题目太长没看,直接看输入输出猜出是最长下降子序列 用了以前的代码直接a了,做法类似贪心,把最小的顺序数存在数组里面,每次二分更新数组得出最长上升子序列 #include<iostream& ...

  5. Makefile中使用$$的使用

      http://blog.csdn.net/darennet/article/details/8185881   Makefile中使用$$的使用     在makefile中,会经常使用shell ...

  6. jquery选择器从认识到使用初级篇

    1.   .class 选择器 ---一种通过元素类别属性查找元素 调用格式: $(".class") ----其中参数表示元素的css类别名称(类选择器)<input cl ...

  7. 《JavaScript 闯关记》之简介

    简介 JavaScript 是面向 Web 的编程语言,绝大多数现代网站都使用了 JavaScript,并且所有的现代 Web 浏览器(电脑,手机,平板)均包含了 JavaScript 解释器. 这使 ...

  8. java调用Command命令

    ----------- import java.io.BufferedReader; import java.io.InputStreamReader; /** * 此类用来执行Command命令 * ...

  9. IIS Could not load file or assembly 'CLDBCommon.DLL' or one of its dependencies.找不到指定的模块

    1.卸载原来的.NET4.0,从新下载.NET4.5.1完整安装程序.后问题解决附:.NET4.5.1下载地址:https://www.microsoft.com/zh-cn/download/det ...

  10. Oracle数据库运维优化六脉神剑口诀

    我们知道数据库性能是数据库运维中至关重要的一个部分,据传在Oracle数据库的江湖中也有威力无比的六脉神剑技能,下面与大家免费分享Oracle大师们广为流传的六脉神剑口诀,一般人我不告诉他哦:) 少商 ...