HDU 1069--DP--(摞箱子问题)

题意:有n中箱子,可以任意选择它的面作为底面,只有当底面的长和宽严格小于下面的箱子时才能放在下面的箱子上。求用这n种箱子能摞的最高的高度(每种箱子的个数不限)。

分析:dp 转移方程:dp[i]=max(dp[j]+a[i],dp[i]),j 从 0 到 i-1,在计算状态转移方程之前先判断箱子的长宽是否满足条件。预先要按照能摞的条件把箱子排序,然后dp;注意每种箱子有三种放置方式,相当于有三种箱子。

1A!很多时候真的只要坚持一下下其实就成功了。

代码:

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n;
struct h{
	int x,y,z;
}a[100];
int dp[100];
bool cmp(h w,h v)
{
	if(w.x!=v.x) return w.x>v.x;
	else return w.y>v.y;
}
int DP()
{
	for(int i=0;i<3*n;i++) dp[i]=a[i].z;
	int mx=-1;
	for(int i=0;i<3*n;i++){
		for(int j=0;j<i;j++){
			if(a[j].x>a[i].x&&a[j].y>a[i].y){
				if(dp[j]+a[i].z>dp[i]) dp[i]=dp[j]+a[i].z;
			}
		}
		if(mx<dp[i]) mx=dp[i];
	}
	return mx;
}
int main()
{
	int m=1;
	while(cin>>n){
		if(!n) break;
		for(int i=0;i<3*n;i+=3){
			cin>>a[i].x>>a[i].y>>a[i].z;
			if(a[i].x<a[i].y)
			   swap(a[i].x,a[i].y);  //交换是为了判断条件的时候保证长和长相比,宽和宽相比
			if(a[i].x>a[i].z)  //第i种箱子的第二种放置方法
			   a[i+1].x=a[i].x,a[i+1].y=a[i].z,a[i+1].z=a[i].y;
			else
			   a[i+1].x=a[i].z,a[i+1].y=a[i].x,a[i+1].z=a[i].y;
			if(a[i].y>a[i].z)  //第i种箱子的第三种放置方法
			   a[i+2].x=a[i].y,a[i+2].y=a[i].z,a[i+2].z=a[i].x;
			else
			   a[i+2].x=a[i].z,a[i+2].y=a[i].y,a[i+2].z=a[i].x;
		}
		sort(a,a+3*n,cmp);
		cout<<"Case "<<m<<": maximum height = ";m++;
		cout<<DP()<<endl;
	}
}
时间: 2024-11-01 23:40:00

HDU 1069--DP--(摞箱子问题)的相关文章

HDU 1069 dp最长递增子序列

B - Monkey and Banana Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1069 Appoint description: Description A group of researchers are designing an experiment to test the IQ of a monkey. They wi

hdu 1069 (DP) Monkey and Banana

题目:这里 题意: Description 一组研究人员正在设计一项实验,以测试猴子的智商.他们将挂香蕉在建筑物的屋顶,同时,提供一些砖块给这些猴子.如果猴子足够聪明,它应当能够通过合理的放置一些砖块建立一个塔,并爬上去吃他们最喜欢的香蕉. 研究人员有n种类型的砖块,每种类型的砖块都有无限个.第i块砖块的长宽高分别用xi,yi,zi来表示. 同时,由于砖块是可以旋转的,每个砖块的3条边可以组成6种不同的长宽高. 在构建塔时,当且仅当A砖块的长和宽都分别小于B砖块的长和宽时,A砖块才能放到B砖块的

HDU 1069&amp;&amp;HDU 1087 (DP 最长序列之和)

H - Super Jumping! Jumping! Jumping! Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1087 Appoint description:  System Crawler  (2015-11-18) Description Nowadays, a kind of chess game called “Su

HDU 1069 Monkey and Banana(DP 长方体堆放问题)

Monkey and Banana Problem Description A group of researchers are designing an experiment to test the IQ of a monkey. They will hang a banana at the roof of a building, and at the mean time, provide the monkey with some blocks. If the monkey is clever

HDU 1069 Monkey and Banana dp 题解

HDU 1069 Monkey and Banana 题解 纵有疾风起 题目大意 一堆科学家研究猩猩的智商,给他M种长方体,每种N个.然后,将一个香蕉挂在屋顶,让猩猩通过 叠长方体来够到香蕉. 现在给你M种长方体,计算,最高能堆多高.要求位于上面的长方体的长要大于(注意不是大于等于)下面长方体的长,上面长方体的宽大于下面长方体的宽. 输入输出 开始一个数n,表示有多少种木块,木块的数量无限,然后接下来的n行,每行3个数,是木块的长宽高三个参量 输出使用这些在满足条件的情况下能够摆放的最大高度 解

[2016-03-30][HDU][1069][Monkey and Banana]

时间:2016-03-27 15:19:40 星期日 题目编号:[2016-03-30][HDU][1069][Monkey and Banana] 题目大意:给定n种积木无限个,问这些积木最大能叠多高,上面的积木长宽必须严格小于下面的积木 分析: dp[i]表示第i个积木在顶部时候的最大高度,那么dp[i] = max(dp[i],dp[j] + h[i]);?ji能放在j上面?ji能放在j上面 初始条件就是长宽最大的高度是它自己, #include <algorithm> #include

HDU 1069 Monkey and Banana(二维偏序LIS的应用)

---恢复内容开始--- Monkey and Banana Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13003    Accepted Submission(s): 6843 Problem Description A group of researchers are designing an experiment to te

C - Monkey and Banana HDU 1069( 动态规划+叠放长方体)

C - Monkey and Banana Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1069 Description A group of researchers are designing an experiment to test the IQ of a monkey. They will hang a banana at the roof

HDU 1069 Monkey and Banana (动规)

Monkey and Banana Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7248    Accepted Submission(s): 3730 Problem Description A group of researchers are designing an experiment to test the IQ of a

HDU 4832(DP+计数问题)

HDU 4832 Chess 思路:把行列的情况分别dp求出来,然后枚举行用几行,竖用几行,然后相乘累加起来就是答案 代码: #include <stdio.h> #include <string.h> #include <iostream> using namespace std; typedef long long ll; const ll MOD = 9999991; const int N = 1005; int t, n, m, k, x, y; ll dp1