poj 2241 The Tower of Babylon
2015-08-13 23:46
447 查看
题目:点击打开链接
题意:给你无数个各种类型的砖块,(不超过30种),选择一些木块把他们来推起来,要求下面的一层比上面的一层的变长都要短,问可以堆得最高高度;
分析:因为砖块的长宽高是可以互相交换的,虽然说每种砖块可以有无数个,但是用的不会超过3个,因为第四个肯定会和3个中长宽高是一样的。所以我们就可以从3*n个砖块中求解了,再将砖块按长排序,这就变成了一个背包问题了,排序可以从大到小排,然后dp的时候,从小开始递推,从3*n-2开始,在这个基础上叠加后面小的,每次找出一个符合条件的最高的以后,更新b[I].z,下一次j走到I的时候,就直接找一个ans就好了
题意:给你无数个各种类型的砖块,(不超过30种),选择一些木块把他们来推起来,要求下面的一层比上面的一层的变长都要短,问可以堆得最高高度;
分析:因为砖块的长宽高是可以互相交换的,虽然说每种砖块可以有无数个,但是用的不会超过3个,因为第四个肯定会和3个中长宽高是一样的。所以我们就可以从3*n个砖块中求解了,再将砖块按长排序,这就变成了一个背包问题了,排序可以从大到小排,然后dp的时候,从小开始递推,从3*n-2开始,在这个基础上叠加后面小的,每次找出一个符合条件的最高的以后,更新b[I].z,下一次j走到I的时候,就直接找一个ans就好了
#include<iostream> #include<algorithm> #include<string> using namespace std; struct block { int x,y,z; }b[95]; bool cmp(block a,block b) { return a.x>b.x; } int main() { int n,x,y,z,flag=1; while(cin>>n&&n){ int maxn=0; for(int i=0;i<3*n;){ cin>>x>>y>>z; b[i].x=max(x,y);b[i].y=min(x,y);b[i++].z=z; b[i].x=max(x,z);b[i].y=min(x,z);b[i++].z=y; b[i].x=max(y,z);b[i].y=min(y,z);b[i++].z=x; } sort(b,b+3*n,cmp); for(int i=3*n-2;i>=0;i--){ int ans=0; for(int j=i+1;j<3*n;j++) if(b[i].x>b[j].x&&b[i].y>b[j].y&&b[j].z>ans) ans=b[j].z; b[i].z+=ans; if(b[i].z>maxn)maxn=b[i].z; } cout<<"Case "<<flag++<<": maximum height = "<<maxn<<endl; } return 0; }
相关文章推荐
- 使用PLSQL Developer和DbVisualizer查询oracle数据库时,出现查询数据中文乱码情况
- Android笔记-4-实现登陆页面并跳转和简单的注册页面
- 连载《一个程序猿的生命周期》-26.组建项目团队
- 关于ListView的Adapter在调用notifyDataSetChanged()方法无效的原因
- 9个offer,12家公司,35场面试,从微软到谷歌,一个应届计算机毕业生的求职之路
- 一些好用的工具
- Zend framework2-过滤器InputFilter相关使用方法
- Unity 将表Excel表转成csv表
- 对最终用户而言界面就是系统
- POJ 1363 Rails
- 代码高亮插件SyntaxHighlighterde
- Berkeley DB数据库
- js基础
- cocos2dx源码之 选择器
- Scala深入浅出实战经典《第85讲:Scala中For表达式的强大表现力实战》笔记
- JAVA基础——常用类及方法
- [BZOJ1015] [JSOI2008]星球大战starwar
- .net简单的记录日志
- 机房收费系统个人重构版:软工文档中那些图
- 2015-08-13