Leo 搭积木
【问题描述】
Leo是一个快乐的火星人,总是能和地球上的 OIers玩得很 high。
2012 到了, Leo 又被召回火星了,在火星上没人陪他玩了,但是
他有好多好多积木,于是他开始搭积木玩。
火星人能制造 n 种积木,积木能无限供应。每种积木都是长方体,
第 i 种积木的长、宽、高分别为 li、 wi、 hi。积木可以旋转,使得
长宽高任意变换。 Leo 想要用这些积木搭一个最高的塔。问题是,如
果要把一个积木放在另一个积木上面,必须保证上面积木的长和宽都
严格小于下面积木的长和宽。这意味着,即使两块长宽相同的积木也
不能堆起来。
火星上没有电脑,好心的你决定帮助 Leo 求出最高的塔的高度。
【输入说明】
第一行,一个整数 n,表示积木的种数
接下来 n 行,每行 3 个整数 li, wi, hi,表示积木的长宽高
【输出说明】
一行一个整数,表示塔高的最大值
【提示】
每种积木都可以拆分成高度分别为 li、 wi、 hi 的三种积木,另

两边作为长和宽,保证长>=宽。

输入

1
10 20 30

输出

40

输入

2
6 8 10
5 5 5

输出

21

输入

5
31 41 59
26 53 58
97 93 23
84 62 64
33 83 27

输出

342

对于此题,将所有可能的积木全部存储起来,然后以长为第一关键字,宽为第二关键字排序(从大到小),再dp一道就行了.

我有两组超时,如果有人能有更好的算法可以跟我说.

 #include <algorithm>
#include <iostream>
#include <cstring>
#include <fstream>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std; ifstream fin("brick.in");
ofstream fout("brick.out"); int cnt_block=;
struct id{
int chang;
int kuan;
int gao;
};
id block[]={};
int jiyi[][]; bool qqsort(id a,id b);
int dp(int now,int pan); bool qqsort(id a,id b){
//if(a.chang>b.chang&&a.kuan>b.kuan)return 1;
if(a.chang>b.chang)return ;
if(a.chang==b.chang&&a.kuan>b.kuan)return ;
return ;
} int dp(int now,int pan){
if(now>cnt_block*)return ;
if(jiyi[now][pan]!=-)return jiyi[now][pan];
int yao=,unyao=;
if((block[now].chang<block[pan].chang&&block[now].kuan<block[pan].kuan)||pan==)
yao=block[now].gao+dp(now+,now);
unyao=dp(now+,pan);
if(yao>unyao)unyao=yao;
jiyi[now][pan]=unyao;
return unyao; } int main(int argc, char** argv) {
fin>>cnt_block;
int cnt_blocks=;
for(int x=;x<=cnt_block;x++){
int a,b,c;
fin>>a>>b>>c;
block[++cnt_blocks].chang=max(a,b);
block[cnt_blocks].kuan=min(a,b);
block[cnt_blocks].gao=c;
block[++cnt_blocks].chang=max(a,c);
block[cnt_blocks].kuan=min(a,c);
block[cnt_blocks].gao=b;
block[++cnt_blocks].chang=max(b,c);
block[cnt_blocks].kuan=min(b,c);
block[cnt_blocks].gao=a;
}
sort(block+,block++cnt_blocks,qqsort);
//for(int x=1;x<=cnt_blocks;x++){
// cout<<block[x].chang<<" "<<block[x].kuan<<" "<<block[x].gao<<endl;
//}
memset(jiyi,-,sizeof(jiyi));
int ans=dp(,);
cout<<ans;
fout<<ans;
return ;
}

Leo 搭积木的更多相关文章

  1. Android_就像小朋友“搭积木”一样。

    就像小朋友“搭积木”一样.感觉这句话很有意思.完整的话是这样的: Android提供了大量功能丰富的UI组件,开发者只要按一定规律把这些UI组件组合起来 --就像小朋友“搭积木”一样,把这些UI组件搭 ...

  2. XJOI1657&Codevs1255搭积木【树状动规】

    搭积木 一种积木搭建方式,高为H的积木,最底层有M个积木,每一层的积木数是他的低一层的积木数+1或-1.总共有N个积木.(且每行积木数不超过10)比如上图N=13 H=6 M=2. 输入格式: 第一行 ...

  3. 蓝桥杯-搭积木-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  4. codevs 3249 搭积木

    提交地址:http://codevs.cn/problem/3249/ 3249 搭积木  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目 ...

  5. [Luogu 2816]宋荣子搭积木

    Description saruka非常喜欢搭积木,他一共有n块积木.而且saruka的积木很特殊,只能一块块的竖着摞,可以摞很多列.说过saruka的是特殊的积木了,这些积木都非常智能,第i块积木有 ...

  6. 搭积木(block)

    [问题描述]小 OY 是一个喜欢搭积木的孩子,他有一天决定向小 C 展示他特别的搭积木技巧.现在一条直线上从左到右有 n 个位置,标号 1..n,第 i 个位置坐标为 x_i.每个位置上都预先叠好了一 ...

  7. 搭积木(java)-蓝桥杯

    搭积木小明最近喜欢搭数字积木,一共有10块积木,每个积木上有一个数字,0~9.搭积木规则:每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小.最后搭成4层的金字塔形,必须用完所有的积木.下 ...

  8. 《陪孩子像搭积木一样学编程》,一起来玩Scratch(1)使用Scratch编程的基本流程

    编程是一件很有趣的事情.初次接触编程,你可能不知所措,别担心,这并不复杂.首先,为了让读者对编程有大概的了解,可以把编写Scratch程序的过程分成7个步骤(如图1.8).注意,这是理想状态.在实际的 ...

  9. 整数N分解,搭积木,离散数学中的母函数,ZOJ(1163)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1163 解题报告: 将整数N分解为:两个及以上的不重复的整数,最流 ...

随机推荐

  1. GDB源代码查找路径

    在gdb程序的时候,有时候会发现源代码文件找不到,对于那些带调试信息的系统库或者第三方库,很多时候当你真正想gdb去追他源代码的时候你会发现gdb根本找不到这些源代码路径.这个时候有两种选择: [1] ...

  2. ubuntu 14.04安装amd omega 驱动

    驱动共分4部分: fglrx_14.501-0ubuntu1_amd64_UB_14.01.deb      52.0MB fglrx-core_14.501-0ubuntu1_amd64_UB_14 ...

  3. js 组件的写法

    var Test1 = function(){ var name = ""; this.setName = function(username){ name = username; ...

  4. js中的forin

    前言 自己在平时没事干练练手,发现的以前一直以为是错的.幸亏今天知道了,要不说起来自己还不知道呢. 过程 遍历前置页面上的textbox,给他们赋值(js). 一开始自己用forin遍历的. 如论如何 ...

  5. 纯JS写出日历

    封装代码: (function(cmf){ cmf.showDcalendar=function(){ var fnname=cmf.fn var id="cmfrili2" va ...

  6. js学习--浏览器对象计时器setInterval()与setTimeout()的使用与区别

    一.setInterval()与setTimeout()的定义: 二.setInterval()与setTimeout()的使用:    1.setInterval()与clearInterval() ...

  7. Unity3D C#脚本开发学习

    1. Inherit from MonoBehaviour,All behaviour scripts must inherit from MonoBehaviour (directly or ind ...

  8. JSOP

    说到 JSONP 就要说到同源策略(Same Origin Policy), 同源策略是浏览器最核心的也是最基本的安全功能. 浏览器的同源策略,限制了来自不同源的 “document” 或脚本,对当前 ...

  9. Contest20140709 testA 树型DP

    testA 输入文件: testA.in 输出文件testA.out 时限5000ms 问题描述: 一棵树N个节点,每条边有一个距W,现在定义SUM为所有dist(X,Y)的和1<=X<Y ...

  10. matlab拟合三维椭球

            同学问的,查了下资料. %需要拟合的点的坐标为(0,-174.802,990.048),(0.472,-171.284,995.463),(0.413,-168.639,1003.55 ...