uva437 - The Tower of Babylon
2016-03-18 23:51
337 查看
题意:
给你n个立方体,让你以长宽为底,一个个搭起来(下面的立方体的长和宽必须大于上面的长和宽)求能得到的最长高,立方体能翻来覆去交换长宽高来用。
思路:
一个立方体交换长宽高可变成3种立方体,然后分别存起来后,按长宽高大小排序,dp[i]则表示以第i个立方体为底能获得的最大高。
代码:用
给你n个立方体,让你以长宽为底,一个个搭起来(下面的立方体的长和宽必须大于上面的长和宽)求能得到的最长高,立方体能翻来覆去交换长宽高来用。
思路:
一个立方体交换长宽高可变成3种立方体,然后分别存起来后,按长宽高大小排序,dp[i]则表示以第i个立方体为底能获得的最大高。
代码:用
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 155; int dp ; struct cft { int x, y, z; }a ; int cmp(cft a, cft b) { return a.x*a.y < b.x*b.y; } int main() { int cas = 0; int m, n,x,y,z; while (scanf("%d", &n) && n) { m = 1; for (int i = 1; i<=n; i++) { scanf("%d%d%d", &x, &y, &z); a[m].x=x,a[m].y=y,a[m].z=z,m++; a[m].x=y,a[m].y=z,a[m].z=x,m++; a[m].x=x,a[m].y=z,a[m].z=y,m++; } sort(a, a + m, cmp); int maxn = 0; for (int i = 1; i<=m; i++) { dp[i] = a[i].z; for (int j = 1; j<i; j++) if (((a[i].x >a[j].y && a[i].y >a[j].x) || a[i].x >a[j].x && a[i].y >a[j].y)) dp[i] = max(dp[i], dp[j] + a[i].z); if (dp[i] >maxn) maxn = dp[i]; } printf("Case %d: maximum height = %d\n", ++cas, maxn); } return 0; }
相关文章推荐
- 【iOS开发-从网络上获取图片尺寸】
- web.xml文件中配置spring的ContextLoaderListener后报错
- 贪心算法解决单源最短路径问题
- Delphi TStream 详细介绍
- 关于char类型的连续输入
- 直方图绘图与直方图的均衡化、规定化
- andorid studio 启动 fetching android sdk..问题解决办法
- Android+PHP+MYSQL开发简单实例
- 2016年Java实习生阿里巴巴面经
- 哈希表,处理冲突的方法
- 封装scrolltop 兼容
- [CodeForces] 510 C Fox And Names [拓扑排序]
- 如何获取 Android 设备的CPU核数、时钟频率以及内存大小
- java面试100题以及答案(二)
- OpenCv3.0架构内容及改变
- Delphi多线程数据库查询(ADO)
- 【LeetCode题意分析&解答】40. Combination Sum II
- javaWeb项目如何添加jar包
- Android常用权限permission列表摘录
- 高精度求平方根