hdu 1069 Monkey and Banana
2016-05-25 19:43
260 查看
有n种形状的长方体,每种都有无限个,要把这些长方体叠起来,使得上层的长方体的底面被完全包含在下次的底面上,问最高能叠出来的高度是多少
对于每一个给出的形状,我们枚举那一面是底面把它存起来
然后按照长方体的底面面积进行排序
定义一个长方体A小于长方体B当且仅当A的底面能被B包含(也就是A可以按照题目要求垒在B上
然后这就是一个LIS了
对于每一个给出的形状,我们枚举那一面是底面把它存起来
然后按照长方体的底面面积进行排序
定义一个长方体A小于长方体B当且仅当A的底面能被B包含(也就是A可以按照题目要求垒在B上
然后这就是一个LIS了
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int INF = 0x3f3f3f3f; const int maxn = 100; struct Rect{ int x,y,z; void init(int X,int Y,int Z){ x = X,y = Y,z = Z; } }; Rect rect[maxn]; int dp[maxn]; bool cmp(Rect a,Rect b){ return a.x * a.y < b.x * b.y; } bool les(Rect a,Rect b){ return (a.x < b.x && a.y < b.y) || (a.x < b.y && a.y < b.x); } int main(){ int n; int icase = 1; while(~scanf("%d",&n) && n){ memset(dp,0,sizeof(dp)); int len = 0; int v[3]; while(n--){ scanf("%d %d %d",&v[0],&v[1],&v[2]); for(int i=0;i<3;i++){ rect[len++].init(v[i],v[(i+1)%3],v[(i+2)%3]); } } sort(rect,rect+len,cmp); memset(dp,0,sizeof(dp)); for(int i=0;i<len;i++){ dp[i] = rect[i].z; for(int j=0;j<i;j++){ if(les(rect[j],rect[i])) dp[i] = max(dp[i],dp[j]+rect[i].z); } } printf("Case %d: maximum height = %d\n" ,icase++,*max_element(dp,dp+len)); } return 0; }
相关文章推荐
- Python pygame安装过程笔记
- Python pygame安装过程笔记
- JavaScript学习--Item4 基本类型和基本包装类型(引用类型)
- java 获取本机的IP和hostname
- 动态加载主题
- Oracle出现字符集问题处理方法
- 第12周项目3-数组类运算符的实现
- 第十三周项目一-分数类中的运算符重载
- BZOJ 2149 拆迁队
- Arcgis Engine 开发初步
- 堆和栈的区别总结
- echarts.min.js:25 Uncaught TypeError: Cannot read property 'features' of undefined 报错解决方法
- 安装Jenkins
- 去除actionBar的三种方法
- POJ 1321 棋盘问题(dfs)
- android BLE从入门到精通开发
- 中庸之士(2007.04.13)
- codeforces57B
- bzoj 1051: [HAOI2006]受欢迎的牛(tarjan 缩点)
- how to install window exe program on ubuntu