uva437(经典DAG题目)

题意:有n(n<=30)中立方体,每种都有无数多个,要求选一些立方体摞成一根尽量高的柱子,立方体使用时的三种摆放方式都可以。并且使得每个立方体的底面长宽分别小于它下方的立方体的底面长宽。

解法:其中每种立方体有三种摆放方式,可以将每种转化成三种立方体,因为一个立方体不可能在一个相同的自己上面,所有每种一个就够了。90个点,并且是有向无环的图,求最长路径,可以拓扑排序,也可以dfs。

代码:

/******************************************************
* @author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string.h>
//freopen ("in.txt" , "r" , stdin);
using namespace std;

#define eps 1e-8
#define zero(_) (abs(_)<=eps)
const double pi=acos(-1.0);
typedef long long LL;
const int Max=110;
const LL INF=0x3FFFFFFF;
struct node
{
   int x,y;
   int tall;
} points[Max];
bool operator<(const node& a,const node& b)
{
    return (a.x<b.x&&a.y<b.y)||(a.y<b.x&&a.x<b.y);
}
vector<int> vec[Max];
int ans[Max];
int n;
void dfs(int t)
{
    if(ans[t]!=-1)
    return ;
    int ma=0;
    for(int i=0;i<vec[t].size();i++)
    {
        dfs(vec[t][i]);
        ma=max(ma,ans[vec[t][i]]);
    }
    ans[t]=ma+points[t].tall;
}
int main()
{
    int kk=1;
  while(cin>>n&&n)
  {
      for(int i=0;i<3*n;i++)
      vec[i].clear();
      for(int i=0;i<n;i++)
      {
          int a,b,c;
          scanf("%d%d%d",&a,&b,&c);
          points[i*3].x=a;
          points[i*3].y=b;
          points[i*3].tall=c;

          points[i*3+1].x=a;
          points[i*3+1].y=c;
          points[i*3+1].tall=b;

          points[i*3+2].x=b;
          points[i*3+2].y=c;
          points[i*3+2].tall=a;
      }
      for(int i=0;i<n*3;i++)
      for(int j=0;j<n*3;j++)
      {
          if(points[i]<points[j])
          vec[i].push_back(j);
      }
      memset(ans,-1,sizeof ans);
      int ma=0;
      for(int i=0;i<n*3;i++)
      {
          dfs(i);
          ma=max(ma,ans[i]);
      }
      printf("Case %d: maximum height = %d\n",kk++,ma);
  }
    return 0;
}
时间: 2024-10-27 02:27:05

uva437(经典DAG题目)的相关文章

Linux驱动经典面试题目

1.  linux驱动分类 2.  信号量与自旋锁 3.  platform总线设备及总线设备如何编写 4.  kmalloc和vmalloc的区别 5.  module_init的级别 6.  添加驱动 7.  IIC原理,总线框架,设备编写方法,i2c_msg 8.  kernel panic 9.  USB总线,USB传输种类,urb等 10.android boot 流程 11.android init解析init.rcLinux驱动经典面试题目,布布扣,bubuko.com

C语言经典面试题目(转的,不过写的的确好!)

第一部分:基本概念及其它问答题 1.关键字static的作用是什么? 这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: 1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问.它是一个本地的全局变量. 3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用.那就是,这个函数被限制在声明它的模块的本地范围内使用. 大多

spoj287 经典网络流题目,二分+网络流判定方案

题目大意:有n个房子,m条边.编号1的点是网络中心.现在给你k个房子,每个房子都要由一根网线连往网络中心.连线有两个规则:1.房子连到网络中心的一根网线必须完整,只有一个颜色.2.边上的所有网线必须颜色都不一样,边是两个房子之间的边,比如3->2->1就经过了两个边求:最少用多少个颜色.具体看题目. 思路: 肯定是最大流没错,关键还是建图. 网上题解一句话说"颜色的数量取决于网络流中各条边中最大的流量,于是二分边的容量并做网络流就可以了."感觉有点牵强. 首先如果你给每个边

PHP经典面试题目汇总(上篇)

1.双引号和单引号的区别 双引号解释变量,单引号不解释变量 双引号里插入单引号,其中单引号里如果有变量的话,变量解释 双引号的变量名后面必须要有一个非数字.字母.下划线的特殊字符,或者用{}讲变量括起来,否则会将变量名后面的部分当做一个整体,引起语法错误 双引号解释转义字符,单引号不解释转义字符,但是解释'\和\\ 能使单引号字符尽量使用单引号,单引号的效率比双引号要高(因为双引号要先遍历一遍,判断里面有没有变量,然后再进行操作,而单引号则不需要判断) 2.常用的超全局变量(8个) $_GET

cc++面试------17道经典面试题目分析

以下是C/C++面试题目,共计17个题目,其中涵盖了c的各种基础语法和算法, 以函数接口设计和算法设计为主.这17个题目在C/C++面试方面已经流行了多 年,大家需要抽时间掌握好,每一个题目后面附有参考答案,希望读者能够抽 时间做完题目后在看参考答案,每一个题目至少做两边,设计出两种解决问题 的算法. 1.比较字符串,输出它们第一个不同字母的位置,大小写不敏感2.判断一个数是不是回文数,数字 1234321.3.比较两字符串长短,并返回结果. 4.给一个字符串,编程取其中一个特定的字符并输出.

测试用例经典面试题目—电梯、杯子、笔、桌子、洗衣机

首先说明的是,遇到这样的测试题目,首先应该反问面试官,需求是什么样的,比如是测什么样的杯子. 因为设计测试用例的规则应该是根据需求分析文档设计用例,客户需求什么,就测试什么.但是在没有需求分析文档的前提下, 来设计测试用例,可以考查一个测试人员的基本功,比如考虑问题是否全面,设计测试用例的方法是否合理等.一般是根据自己的日常经验和测试的思维来设计测试用例.在设计测试用例时一般从以下几个方面进行分析:功能测试,性能测试,界面测试,安全性测试,兼容性测试,可用性测试,可靠性测试,本地化/国际化测试.

直通大厂:Java必考系列——JVM经典面试题目(含答案)

Q1:类的加载机制是什么?答:类加载到内存中主要有5个阶段,分别为①加载:将Class文件读取到运行时数据区的方法区内,在堆中创建Class对象,并封装类在方法区的数据结构的过程.②验证:主要用于确保Class文件符合当前虚拟机的要求,保障虚拟机自身的安全,只有通过验证的Class文件才能被JVM加载.③准备:主要工作是在方法区中为类变量分配内存空间并设置类中变量的初始值.④解析:将常量池中的符号引用替换为直接引用.⑤初始化:主要通过执行类构造器的<client>方法为类进行初始化,该方法是在

hdu 1455 Sticks——dfs经典的题目

http://acm.hdu.edu.cn/showproblem.php?pid=1455 题意:几根长度的棍子被分成了很多半.问合成多个长度相同的棍子,棍子长度最小是多少. 题解:很明显是dfs.所以我们首先需要找到,这些棍子可能是多长,肯定是最长的棍子的长度到所有棍子长度和之间的某个长度.找到这些可能之后就直接按照这个长度开始搜.想法是搜到和为这个长度之后记录,然后重新再搜,一直到所有棍子都分配自后就完成了. 重要的剪枝:确定每次搜索的起始位置,这个一定是确定的!!!其次就是相同长度的棍子

33条C#、.Net经典面试题目及答案

1, 请你说说.NET中类和结构的区别? 答:结构和类具有大体的语法,但是结构受到的限制比类要多.结构不能申明有默认的构造函数,为结构的副本是又编译器创建和销毁的,所以不需要默认的构造函数和析构函数.结构是值类型,所以对结构变量所做的改变不会影响其的原值,而类是应用类型,改变其变量的值会改变其原值.申明结构用Struck关键字,申明类用class关键字,向方法传递结构是时是通过值传递的,而不是通过引用.与类不同,结构的实例化可以不使用New关键字.类可以实现接口. 2, 死锁的必要条件?怎么克服