[DP] HDU 1069
来源:互联网 发布:C语言手写笔记图片 编辑:程序博客网 时间:2024/06/05 17:26
题意
给定箱子种类数量n,及对应长宽高,每个箱子数量无限,求其能叠起来的最大高度是多少(上面箱子的长宽严格小于下面箱子)
思路
每种箱子有三种放置方式且数量无限,故可将每个箱子按三个箱子看待。对所有箱子按主长副宽进行先大后小排序,那么问题就成了求最大递增子串。
因为n的范围特别小,只有30,所以直接两重循环dp即可以上是dalao的做法
我自己写的是放了六个…..似乎也有人这么做
然后按照长排序,在求宽关于高的最长递增子序列
代码
#include <algorithm>#include <cstdio>#include <cstring>#include <iostream>#include <vector>#define N 200#define INF 0x7f7f7f7fusing namespace std;struct Node { int x, y, z; bool operator< ( const Node t ) const { return ( x > t.x ); }};vector<Node> v;int dp[ N ];int LIS ( int n ) { int mx = 0; for ( int i = 0; i < n; ++i ) { dp[ i ] = v[ i ].z; for ( int j = 0; j < i; ++j ) { if ( v[ j ].x > v[ i ].x && v[ j ].y > v[ i ].y && dp[ j ] + v[ i ].z > dp[ i ] ) dp[ i ] = dp[ j ] + v[ i ].z; if ( dp[ i ] > mx ) mx = dp[ i ]; } } return mx;}int main () { int n, kse = 0; while ( ~scanf ( "%d", &n ) && n ) { v.clear (); memset ( dp, 0, sizeof ( dp ) ); for ( int i = 0; i < n; ++i ) { int a, b, c; scanf ( "%d%d%d", &a, &b, &c ); v.push_back ( Node{a, b, c} ); v.push_back ( Node{a, c, b} ); v.push_back ( Node{b, a, c} ); v.push_back ( Node{b, c, a} ); v.push_back ( Node{c, a, b} ); v.push_back ( Node{c, b, a} ); } sort ( v.begin (), v.end () ); int sol = LIS ( n * 6 ); printf ( "Case %d: maximum height = %d\n", ++kse, sol ); } return 0;}
阅读全文
0 0
- HDU 1069 dp
- HDU 1069 DP
- hdu 1069 DP
- HDU 1069 DP
- hdu 1069 dp
- HDU 1069 dp
- hdu 1069 dp
- HDU 1069 (DP)
- HDU 1069 DP 经典
- hdu 1069 (dp)
- DP HDU-1069
- #HDU 1069 简单dp
- HDU 1069 dp??
- hdu 1069(dp)
- HDU 1069 DP
- hdu 1069 dp
- [DP] HDU 1069
- HDU DP
- HDOJ1555 How many days?
- 代理模式
- 【SQL解惑】谜题19:销售冠军
- JVM垃圾回收机制
- maven项目,struts2+spring+mybatis框架搭建整合,tomcat部署,开发工具Idea
- [DP] HDU 1069
- 【SQL解惑】谜题20:测验结果
- 基于Java代码对this,动态绑定,覆盖和隐藏的探讨和思考
- udacity计算机科学导论- 课程11-数组元素
- 【广告算法工程师入门 29】机制设计-关键词拍卖的创意优化,样式优选,高度控制等
- 相对熵
- 【SQL解惑】谜题21:飞机与飞行员
- 6.springboot整合mybitas(xml方式)+开启申明式事物
- 50. Pow(x, n)