题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069
题意:给n种长方体,每种有无限个,让你把这些长方体摞起来。要求下面的比上面的长宽要大。求一个摞起来的最高高度。
题解:这道题,无限个长方体,其实没什么用。因为每种长方体能变成6个长方体。因为下面的长宽要比上面的大,所以相等的长宽是没用的。每种长方体也就只有6中情况。那么我们问题就变成了,6*n个长方体求一个最高的摆法=-=。
按照长宽从大到小排个序,然后求一个高的最长下降子序列。因为高是正整数,所以只要有就一定能增加高度。
贪心和DP的思路掺杂的。整理好逻辑还是蛮好理解的
看代码
#include<bits/stdc++.h>
using namespace std;
struct node{
int l,w,h;
}cd[191];
int dp[181];
bool cmp(node a,node b){
if(a.l == b.l) return a.w < b.w;
else return a.l < b.l;
}
int main(){
int i,j,n,len,t_num = 1;
int z1,z2,z3;
while(cin >> n && n){
len = 0;
for(int i = 0 ; i < n ; i ++){
cin >> z1 >> z2 >> z3;
cd[len].l = z1,cd[len].w = z2,cd[len++].h = z3;
cd[len].l = z1,cd[len].w = z3,cd[len++].h = z2;
cd[len].l = z2,cd[len].w = z1,cd[len++].h = z3;
cd[len].l = z2,cd[len].w = z3,cd[len++].h = z1;
cd[len].l = z3,cd[len].w = z1,cd[len++].h = z2;
cd[len].l = z3,cd[len].w = z2,cd[len++].h = z1;
}
sort(cd,cd+len,cmp);
dp[0] = cd[0].h;
int max_h;
for(int i = 1 ; i < len ; i ++){
max_h = 0;
for(int j = 0 ; j < i ; j ++){
if(cd[j].l < cd[i].l && cd[j].w < cd[i].w)
max_h = max_h > dp[j] ? max_h : dp[j];
}
dp[i] = cd[i].h + max_h;
}
max_h = 0;
for(int i = 0 ; i < len ; i ++)
if(max_h < dp[i])
max_h = dp[i];
cout << "Case " << t_num++ << ": maximum height = " << max_h << endl;
}
}