Monkey and Banana HDU - 1069 (基础dp)

Monkey and Banana

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.

InputThe 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. 
OutputFor 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 种砖,每一种都无限多,分别有长宽高,可以任意摆放。现在要把这些砖叠起来,如果 A 放在 B 上,要求 A 的长宽比 B 的长宽都要小。问最多能叠多高。。。思路:由于每种砖有无限多,直接枚举一块砖所有可能摆放方式的长宽高,然后按照长,宽排序 ... 然后就类似LIS的问题 ...

#include<bits/stdc++.h>
#define debug(x) cout << "[" << #x <<": " << (x) <<"]"<< endl
#define pii pair<int,int>
#define clr(a,b) memset((a),b,sizeof(a))
#define rep(i,a,b) for(int i = a;i < b;i ++)
#define pb push_back
#define MP make_pair
#define LL long long
#define ull unsigned LL
#define ls i << 1
#define rs (i << 1) + 1
#define INT(t) int t; scanf("%d",&t)

using namespace std;

struct xx{
    int c,k,g;
    xx(int c = 0,int k = 0,int g = 0):
        c(c),k(k),g(g){}
}zhuan[185];
int dp[185];

bool cmp(xx A,xx B){
    if(A.c != B.c) return A.c < B.c;
    return A.k < B.k;
}

int main() {
    int n;
    int cas = 0;
    while(~scanf("%d",&n) && n){
        int cnt = 0;
        for(int i = 1;i <= n;++ i){
            int l,r,k; scanf("%d%d%d",&l,&r,&k);
            zhuan[++ cnt] = xx(l,r,k);
            zhuan[++ cnt] = xx(l,k,r);
            zhuan[++ cnt] = xx(r,l,k);
            zhuan[++ cnt] = xx(r,k,l);
            zhuan[++ cnt] = xx(k,l,r);
            zhuan[++ cnt] = xx(k,r,l);
        }
        sort(zhuan + 1,zhuan + cnt + 1,cmp);
        rep(i,1,cnt + 1) dp[i] = zhuan[i].g;
        for(int i = 1;i <= cnt;++ i){
            for(int j = i + 1;j <= cnt;++ j)
                if(zhuan[i].c < zhuan[j].c && zhuan[i].k < zhuan[j].k)
                    dp[j] = max(dp[j],dp[i] + zhuan[j].g);
        }
        int maxx = 0;
        for(int i = 1;i <= cnt;++ i)
            maxx = max(maxx,dp[i]);
        cout << "Case " << ++ cas << ": maximum height = " << maxx << endl;
//        cout << maxx << endl;
    }
    return 0;
}

 

原文地址:https://www.cnblogs.com/rookie-acmer/p/11270193.html

时间: 2024-10-01 18:08:13

Monkey and Banana HDU - 1069 (基础dp)的相关文章

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

Monkey and Banana HDU - 1069 有点像背包,又像最长上升序列

#include<iostream> #include<algorithm> #include<cstring> #include<vector> using namespace std; const int INF=0x3f3f3f3f; struct node{ int l,s,h; }; vector<node>v; //按照长宽排序 bool cmp(node a,node b) { if(a.l==b.l) return a.s<

HDU 1029 基础dp

题目链接:Ignatius and the Princess IV 大意:就是在N个数里找出唯一一个至少出现过(N+1)/ 2 次的数. 1 <= N <= 999999. hash: 1 /* 2 题意好懂.就是在N个数里找出唯一一个至少出现过(N+1)/ 2 次的数. 1 <= N <= 999999. 3 如果我用一个map 标记的话.大概也只是10^6吧. 4 然而还是卡了cin 和 cout. 5 */ 6 7 #include <stdio.h> 8 #in

HDU 1069 基础动态规划+排序

题意 给出n种立方体石头 当且仅当一块石头的底部宽度长度都小于一块石头的时候才能放在上面 问最高能放多高?石头不限数目 然而同样一种石头采用同样的摆放方式 两快相同石头一定无法进行放置 所以 一块石头的一种摆放方式最多使用一次 进行一下排序 让长与宽最小的放在最前面 然后就是可爱的dp模板了 #include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<m

[ An Ac a Day ^_^ ] HDU 1257 基础dp 最长上升子序列

最近两天在迎新 看来只能接着水题了…… 新生培训的任务分配 作为一个有担当的学长 自觉去选了动态规划…… 然后我觉得我可以开始水动态规划了…… 今天水一发最长上升子序列…… kuangbin有nlogn的模板…… 自己写一发原来学的吧…… 1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<math.h> 5 #include<string.h> 6

Max Sum Plus Plus HDU - 1024 基础dp 二维变一维的过程,有点难想

/* dp[i][j]=max(dp[i][j-1]+a[j],max(dp[i-1][k])+a[j]) (0<k<j) dp[i][j-1]+a[j]表示的是前j-1分成i组,第j个必须放在前一组里面. max( dp[i-1][k] ) + a[j] )表示的前(0<k<j)分成i-1组,第j个单独分成一组. */ #include <iostream> #include <cstdio> #include <cstring> #inclu

HDU 1003 基础dp 最大连续序列和

常常做错的一道题.. 因为总是要有一个长度的 所以一开始的s与e都是1 maxx也是a[1] 然后再求 从i=2开始 在这里注意 me永远是当前i 而ms则可能留在原地 可能直接等于i 判断条件就是当前序列和与当前序列和加上a[i]的关系 好久没做题了..手生啊... #include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<math.h> us

ACM-经典DP之Monkey and Banana——hdu1069

***************************************转载请注明出处:http://blog.csdn.net/lttree*************************************** Monkey and Banana Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6984    Accep

基础dp

队友的建议,让我去学一学kuangbin的基础dp,在这里小小的整理总结一下吧. 首先我感觉自己还远远不够称为一个dp选手,一是这些题目还远不够,二是定义状态的经验不足.不过这些题目让我在一定程度上加深了对dp的理解,但要想搞好dp,还需要多多练习啊. HDU - 1024 开场高能 给出一个数列,分成m段,求这m段的和的最大值,dp[i][j]表示遍历到第i个数,已经划分了j段,对于每一个数有两种决策,加入上一个区间段,自己成为一个区间段,故dp[i][j] = max(dp[i-1][j]+