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. Linux Bash环境下单引(')、双引号(")、反引号(`)、反斜杠(\)的小结

    在bash中,$.*.?.[.].’.”.`.\.有特殊的含义.类似于编译器的预编译过程,bash在扫描命令行的过程中,会在文本层次上,优先解释所有的特殊字符,之后对转换完成的新命令行,进行内核的系统 ...

  2. (转)Android开发:性能最佳实践-管理应用内存

    翻自:http://developer.android.com/training/articles/memory.html 在任何软件开发环境中,RAM都是宝贵的资源,但在移动操作系统中更加珍贵.尽管 ...

  3. php日期处理

    $datetime=strtotime(date("Y-m-d",time()));//获取当前日期并转换成时间戳 $datetime=$datetime+86400;//在时间戳 ...

  4. js 保留小数位数

    eg: var num=3.1415926 小数位处理:num.toFixed(n)      n:小数位数

  5. CoffeeScript飞一样的写javascript

    之前看到同事在使用coffeescript写js,当我看到那简介的coffee文件,就深深的被coffescript吸引了,简洁的语法,熟练之后会大大提升javascript的开发速度,写脚本也能像飞 ...

  6. input 表单点击消失离开出现

    效果1: <input type="text" name="textfield" value="这里是提示内容" onclick=&q ...

  7. Ext.Array 方法

    1. Ext.Array.clean(arr); 过滤数组中的空元素 var arr = [1,"",2,"",3]; Ext.clean(arr); // [ ...

  8. [Linux]关机和重启命令

     Linux中常用的关机和重新启动命令有shutdown.halt.reboot以及init,它们都可以达到关机和重新启动的目的,但是每个命令的内部工作过程是不同的,下面将逐一进行介绍. 1. shu ...

  9. CURL传输与获取功能

    什么是CURL? 利用URL语法爱命令行方式下工作的文件传输工具.它支持很多协议.它支持认证功能.php中常用都实现更复杂的传输功能. 实现的功能: 1.实现远程获取和采集内容 2.实现PHP 网页版 ...

  10. Ubuntu14.04不支持U盘exfat格式该如何解决

    转: http://www.jb51.net/os/Ubuntu/275158.html exfat是U盘的文件系统,很多系统都支持exfat格式的使用,但Ubuntu系统并不支持exfat格式,要如 ...