Monkey and Banana 题解(动态规划)
Monkey and Banana 简单的动态规划
1.注:
本人第一篇博客,有啥不足还请多多包涵,有好的建议请指出。你以为有人读你博客,还给你提意见。
2.原题
Background:
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(为了好看,前面多了tab,复制时注意一下,第一次写博客,也不知影不影响复制)
Sample Output
Case 1: maximum height = 40
Case 2: maximum height = 21
Case 3: maximum height = 28
Case 4: maximum height = 342
3.题目大意
猴子(为了还原背景。。。)有n种长方体(每种都没有数量限制),长宽高都给你,让你帮猴子计算他能搭多高
限制:下面的长方体的长和宽都要大于上面的,当然哪条边是长,哪条边是宽,哪条边是高你说了算。
4.分析题目
猴子很聪明,他们先把问题简单化,我们也试试:
如果长宽高是给定的,我怎么解决这个问题?
友好城市这题做过吗?没有的话就先去做一下。类似的,我们这一题也可以像友好城市那样做。
要求长宽都是递增的,那就先对长或宽进行排序,然后再找另一个的最长上升子序列(当然,这里每个的权值就不一定是1了),找完之后,答案不就出来了吗?
猴子表示想到这里就可以了,但是我们是人类,要展现人类的智慧:
我们要把长方体进行旋转。
咋旋转呢,我们这样想,a,b,c三个,别管怎么放置,每种放置只用一次(因为要求严格上升吗),那就瞬间好办了:
我把一个长方体变成6个!!!
那不会用重了吗?哦,兄弟,非常抱歉,请你再读一遍题。
于是问题迎刃而解。
5.别整没用的,上代码
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=*+;
int Dp[maxn];
struct K{
int x;
int y;
int h;
friend bool operator < (K a,K b){
return a.x<b.x;
}
}tin[maxn];//物品的结构体
int main(){
int n;
int jsjs=;
while(){//这样写大家习惯吗?
jsjs++;
scanf("%d",&n);
if(!n)
break;
memset(Dp,,sizeof(Dp));
for(int i=;i<=n;i++){
scanf("%d%d%d",&tin[i].x,&tin[i].y,&tin[i].h);
tin[i+n].x=tin[i].y;//这里可要想清楚,还有,可整个函数
tin[i+n].y=tin[i].x;
tin[i+n].h=tin[i].h;
tin[i+n*].x=tin[i].y;
tin[i+n*].y=tin[i].h;
tin[i+n*].h=tin[i].x;
tin[i+n*].x=tin[i].h;
tin[i+n*].y=tin[i].y;
tin[i+n*].h=tin[i].x;
tin[i+n*].x=tin[i].x;
tin[i+n*].y=tin[i].h;
tin[i+n*].h=tin[i].y;
tin[i+n*].x=tin[i].h;
tin[i+n*].y=tin[i].x;
tin[i+n*].h=tin[i].y;
}
sort(tin+,tin++*n);
int ans=;
for(int i=;i<=*n;i++){
Dp[i]=tin[i].h;
for(int j=;j<i;j++)//数据范围真的友好
if(tin[i].x>tin[j].x&&tin[i].y>tin[j].y)
Dp[i]=max(Dp[i],Dp[j]+tin[i].h);
ans=max(ans,Dp[i]);
}
printf("Case %d: maximum height = %d\n",jsjs,ans);
}
return ;
}
Monkey and Banana 题解(动态规划)的更多相关文章
- HDU 1069 Monkey and Banana(动态规划)
		
Monkey and Banana Problem Description A group of researchers are designing an experiment to test the ...
 - HDU 1069 Monkey and Banana (动态规划、上升子序列最大和)
		
Monkey and Banana Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
 - hdu 1069 Monkey and Banana 【动态规划】
		
题目 题意:研究人员要测试猴子的IQ,将香蕉挂到一定高度,给猴子一些不同大小的箱子,箱子数量不限,让猩猩通过叠长方体来够到香蕉. 现在给你N种长方体, 要求:位于上面的长方体的长和宽 要小于 下面 ...
 - 随手练——ZOJ 1093 Monkey and Banana(动态规划)
		
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=93 一堆科学家研究猩猩的智商,给他M种长方体,每种N个. 然后,将一个 ...
 - HDU 1069  Monkey and Banana (动态规划)
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069 简单记录一下 思路:把长方体的各种摆法都存到数组里面,然后按照长宽排序,再dp即可 转移方程 d ...
 - HDU 1069 Monkey and Banana dp 题解
		
HDU 1069 Monkey and Banana 纵有疾风起 题目大意 一堆科学家研究猩猩的智商,给他M种长方体,每种N个.然后,将一个香蕉挂在屋顶,让猩猩通过 叠长方体来够到香蕉. 现在给你M种 ...
 - HDU——Monkey and Banana 动态规划
		
Monkey and Banana Time Limit:2000 ...
 - Monkey and Banana(HDU 1069 动态规划)
		
Monkey and Banana Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
 - ZOJ  1093   Monkey and Banana  (LIS)解题报告
		
ZOJ 1093 Monkey and Banana (LIS)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
 
随机推荐
- opencl(3)程序、内核
			
1:程序 1)从上下文中创建程序 cl_program clCreateProgramWithSource( cl_context context, //上下文 cl_uint count, //文本 ...
 - Linux学习初级篇-鸟哥的Linux私房菜 基础学习篇(第四版)
			
0.1.2 一切设计的起点:CPU的架构 由于CPU的内部是有一些微指令组成的,所以我们所使用的软件都是要经过CPU内部的微指令集来达成才行.那这些指令集的设计主要又被分为两种设计理念,这是目前世界上 ...
 - MySQL 8.0二进制包安装
			
1.官方下载 https://dev.mysql.com/downloads/mysql/ 这样就可以下载二进制包了 1.删除之前安装的MySQL包 [root@localhost ~]# rpm - ...
 - vue无法选择上传相同文件
			
使用h5自带的input type=file时,使用change触发上传事件 <input class="exportss" type="file" id ...
 - filebeat v6.3 多行合并的步骤 多个表达式同时匹配
			
配置文件位于/etc/filebeat/filebeat.yml,就是filebeat的主配置文件打开文件filebeat.yml,搜索multiline:,默认是注释的,常用的有如下三个配置: mu ...
 - 解决:gradle 前言中不允许有内容
			
将Android Studio 升级到4.0然后创建一个新项目,编译出现“ gradle 前言中不允许有内容” 的错误,在网上找了很多资料,众说纷纭,但都没有解决我的问题,最后反复摸索把问题解决了. ...
 - 在kubernetes中搭建harbor,并利用MinIO对象存储保存镜像文件
			
前言:此文档是用来在线下环境harbor利用MinIO做镜像存储的,至于那些说OSS不香吗?或者单机harbor的,不用看了.此文档对你没啥用,如果是采用单机的harbor连接集群MinIO,请看我的 ...
 - [每日一题2020.06.13]leetcode #739 #15 单调栈 双指针查找
			
739 每日温度 ( 单调栈 ) 题目 : https://leetcode-cn.com/problems/daily-temperatures/ 题意 : 找到数组每一个元素之后第一个大于它的元素 ...
 - 解决错误【selenium.common.exceptions.SessionNotCreatedException】
			
以前能用,突然不能用了,是浏览器版本可能升级了,与原来的weddriver驱动版本不符合 解决办法:1.更新浏览器驱动, 2.降低浏览器版本
 - 将反向传播讲解的深入透彻的神一样的文章(numpy实现人工神经网络)
			
为了完成机器学习课的项目,规定不许调tensorflow,pytorch这些包.可是要手工实现一个可训练的神经网络是非常困难的一件事,难点无他,就在于反向传播的实现.这不,我在网上发现了这篇文章.怎么 ...