HDU 1069 Monkey and Banana (DP(最长上升子序列变形))

题目链接: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; 
			}
}

猜你喜欢

转载自blog.csdn.net/PK__PK/article/details/81479034