hdu 1069 Monkey and Banana【dp】
2016-04-08 15:01
691 查看
Monkey and Banana
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 11250 Accepted Submission(s): 5896
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 enough, it shall be able to reach the banana
by placing one block on the top another to build a tower and climb up to get its favorite food.
The researchers have n types of blocks, and an unlimited supply of blocks of each type. Each type-i block was a rectangular solid with linear dimensions (xi, yi, zi). A block could be reoriented so that any two of its three dimensions determined the dimensions
of the base and the other dimension was the height.
They want to make sure that the tallest tower possible by stacking blocks can reach the roof. The problem is that, in building a tower, one block could only be placed on top of another block as long as the two base dimensions of the upper block were both strictly
smaller than the corresponding base dimensions of the lower block because there has to be some space for the monkey to step on. This meant, for example, that blocks oriented to have equal-sized bases couldn't be stacked.
Your job is to write a program that determines the height of the tallest tower the monkey can build with a given set of blocks.
Input
The input file will contain one or more test cases. The first line of each test case contains an integer n,
representing the number of different blocks in the following data set. The maximum value for n is 30.
Each of the next n lines contains three integers representing the values xi, yi and zi.
Input is terminated by a value of zero (0) for n.
Output
For each test case, print one line containing the case number (they are numbered sequentially starting from 1) and the height of the tallest possible tower in the format "Case case: maximum height = height".
Sample Input
1
10 20 30
2
6 8 10
5 5 5
7
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
5
31 41 59
26 53 58
97 93 23
84 62 64
33 83 27
0
Sample Output
Case 1: maximum height = 40
Case 2: maximum height = 21
Case 3: maximum height = 28
Case 4: maximum height = 342
题目大意:有n个小块,每个块能摆成6种方案,每个小块提供无数个,上边的长和宽要小于下边的长和宽。问最高能够叠多高。
思路:
我们使用排序的方法,保证长或者宽递增。然后我们就化问题变成求最长递减子序列的问题了。我们设dp【i】表示使用第i块的时候能叠多高,辣么:
dp【i】=(max(dp【j】(0<=j<i))+a【i】.z)当然a【j】.y一定要大于a【i】.y才行、
AC代码:
#include<stdio.h> #include<algorithm> #include<string.h> #include<iostream> using namespace std; struct zuobiao { int x,y,z; }e[10000]; int dp[10000]; int cmp(zuobiao a,zuobiao b) { if(a.x!=b.x) return a.x>b.x; else return a.y<b.y; } int main() { int n; int kase=0; while(~scanf("%d",&n)) { if(n==0)break; int cont=0; for(int i=0;i<n;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); e[cont].x=a;e[cont+1].x=c;e[cont+2].x=a;e[cont+3].x=b;e[cont+4].x=b;e[cont+5].x=c; e[cont].y=b;e[cont+1].y=b;e[cont+2].y=c;e[cont+3].y=a;e[cont+4].y=c;e[cont+5].y=a; e[cont].z=c;e[cont+1].z=a;e[cont+2].z=b;e[cont+3].z=c;e[cont+4].z=a;e[cont+5].z=b; cont+=6; } memset(dp,0,sizeof(dp)); sort(e,e+cont,cmp); int output=0; for(int i=0;i<cont;i++) { int maxn=0; for(int j=0;j<i;j++) { if(e[j].y>e[i].y) { maxn=max(maxn,dp[j]); } } maxn+=e[i].z; dp[i]=maxn; output=max(dp[i],output); } printf("Case %d: maximum height = %d\n",++kase,output); } }
相关文章推荐
- 【HDU 5366】The mook jong 详解
- 【HDU 2136】Largest prime factor 详细图解
- 【HDU 1568】Fibonacci 数学公式 详解
- HDU 1568
- HDU1290
- HDU1568(Fobonacci公式)
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)
- HDU 1405
- HDU 1297
- hdu 1205
- hdu 2087
- hdu 1016
- HDU 4898 The Revenge of the Princess’ Knight ( 2014 Multi-University Training Contest 4 )
- HDU 5592 ZYB's Premutation 线段树(查找动态区间第K大)
- HDU 5240 Exam (好水的题)
- HDU5237 Base64 大模拟
- HDU 1000
- HDU 1001
- 2015-11-11 hdu新生赛 A题(AC)
- 2015-11-11 hdu新生赛 C题(结束后一发AC)