Monkey and Banana

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6866 Accepted Submission(s):
3516

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组数,每组有三个整数,分别代表长方体的长、宽、高,但又不确定三者之间的具体关系,所以给定的三个整数又可以分成三组数据,例如给定10、20、30,则有(30,20,10)、(30,10,20)、(20,10,30)三种情况。将所有的数据以长和宽为依据从小到大(或从大到小)排列之后,求得最长递增(减)子序列,然后将序列的高相加,即得到最大的高度。
状态转移方程为dp[i] = max(dp[i],dp[j]+r[i].z),0<=j<i。
 
下面是代码:
 #include <iostream>
#include <algorithm>
using namespace std; typedef struct rectangular{
int x,y,z;
}R;
R r[];
int k;
bool cmp(R a,R b)
{
if(a.x == b.x)
return a.y<b.y;
return a.x<b.x;
}
int dp()
{
int i, j;
int dp[];
sort(r,r+k,cmp);
int maxheight = ;
for(i=; i<k; i++)
{
dp[i] = r[i].z;
for(j=;j<i; j++)
if(r[i].x>r[j].x && r[i].y>r[j].y)
if(dp[j]+r[i].z > dp[i])
dp[i] = dp[j]+r[i].z;
if(maxheight < dp[i])
maxheight = dp[i];
}
return maxheight;
}
int main()
{
int n, i, cas=;
int x, y, z;
while(cin>>n && n)
{
k = ;
for(i=; i<n; i++)
{
cin>>x>>y>>z;
r[k].x = max(x,y);
r[k].y = min(x,y);
r[k++].z = z;
r[k].x = max(x,z);
r[k].y = min(x,z);
r[k++].z = y;
r[k].x = max(y,z);
r[k].y = min(y,z);
r[k++].z = x;
}
cout<<"Case "<<cas++<<": maximum height = "<<dp()<<endl;
}
return ;
}

杭电oj 1069 Monkey and Banana 最长递增子序列的更多相关文章

  1. HDU 1069 Monkey and Banana(最长递减子序列)

    题目链接 题意:摞长方体,给定长方体的长宽高,个数无限制,可随意翻转,要求下面的长方体的长和宽都大于上面的,都不能相等,问最多能摞多高. 题解:个数无限,其实每种形态最多就用一次,把每种形态都单独算一 ...

  2. C#利用POST实现杭电oj的AC自动机器人,AC率高达50%~~

    暑假集训虽然很快乐,偶尔也会比较枯燥,,这个时候就需要自娱自乐... 然后看hdu的排行榜发现,除了一些是虚拟测评机的账号以外,有几个都是AC自动机器人 然后发现有一位作者是用网页填表然后按钮模拟,, ...

  3. 杭电oj 2095 & 异或^符号在C/C++中的使用

    异或^符号,在平时的学习时可能遇到的不多,不过有时使用得当可以发挥意想不到的结果. 值得注意的是,异或运算是建立在二进制基础上的,所有运算过程都是按位异或(即相同为0,不同为1,也称模二加),得到最终 ...

  4. 用python爬取杭电oj的数据

    暑假集训主要是在杭电oj上面刷题,白天与算法作斗争,晚上望干点自己喜欢的事情! 首先,确定要爬取哪些数据: 如上图所示,题目ID,名称,accepted,submissions,都很有用. 查看源代码 ...

  5. 杭电oj 4004---The Frog Games java解法

    import java.util.Arrays; import java.util.Scanner; //杭电oj 4004 //解题思路:利用二分法查找,即先选取跳跃距离的区间,从最大到最小, // ...

  6. HDU 1069 Monkey and Banana / ZOJ 1093 Monkey and Banana (最长路径)

    HDU 1069 Monkey and Banana / ZOJ 1093 Monkey and Banana (最长路径) Description A group of researchers ar ...

  7. HDU 1069 Monkey and Banana(转换成LIS,做法很值得学习)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069 Monkey and Banana Time Limit: 2000/1000 MS (Java ...

  8. 『ACM C++』HDU杭电OJ | 1415 - Jugs (灌水定理引申)

    今天总算开学了,当了班长就是麻烦,明明自己没买书却要带着一波人去领书,那能怎么办呢,只能说我善人心肠哈哈哈,不过我脑子里突然浮起一个念头,大二还要不要继续当这个班委呢,既然已经体验过就可以适当放下了吧 ...

  9. HDU 1069 Monkey and Banana dp 题解

    HDU 1069 Monkey and Banana 纵有疾风起 题目大意 一堆科学家研究猩猩的智商,给他M种长方体,每种N个.然后,将一个香蕉挂在屋顶,让猩猩通过 叠长方体来够到香蕉. 现在给你M种 ...

随机推荐

  1. 百度ueditor 拖文件或world 里面复制粘贴图片到编辑中 上传到第三方问题

    我这边从world 里面复制粘贴图片到编辑器中,它自动给我上传了,但是我是用的第三方的要设置一个token值,我找了很久,也没有找到应该在哪里设置这个上传的参数,如果是点击图片上传,我知道在dialo ...

  2. SQL 中怎么查询一个数据库中一共有多少个表

    用户表:select count(*) 总表数 from sysobjects where xtype='u' 总表数:select count(*) 总表数 from sysobject s whe ...

  3. WebApp之Meta标签

    <meta name="apple-touch-fullscreen" content="yes">"添加到主屏幕“后,全屏显示 < ...

  4. Redis入门笔记(二)-配置及运行

    转自: http://gly199.iteye.com/blog/1056424 1.redis基本参数 redis的配置文件中的常见参数如下: daemonize   是否以后台进程运行,默认为no ...

  5. Spark Kill Application

    yarn application -kill <applicationId>

  6. HTML5初学篇章_4

    HTML5的表单所有type类型(补第一章) 类型 说明 button 定义可点击的按钮(大多与 JavaScript 使用来启动脚本) checkbox 定义复选框. color 定义拾色器. da ...

  7. 对Oracle数据库坏块的理解

    1.物理坏块和逻辑坏块 在数据库中有一个概念叫做数据块的一致性,Oracle的数据块的一致性包括了两个层次:物理一致性和逻辑一致性,如果一个数据块在这两个层次上存在不一致性,那就对应到了我们今天要要说 ...

  8. css3 animation 实现环形路径平移动画

    注意 @keyframes to/from 的学习 <!DOCTYPE html> <html lang="en"> <head> <me ...

  9. Android课程---首学开发

    新建一个Activity2类: package com.hanqi.test; import android.app.Activity; import android.os.Bundle; impor ...

  10. shopnc 支持 支付宝快捷登陆 shopnc权限验证原理说明

    为目前使用的是shopnc商场二次开发,shopnc本身做了qq互联和微博快捷登陆的api,做成了集成通用的接口 首先说下基本的这种类型的api访问方式,首先,的有个配置文件,配置你申请的id和key ...