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 题解(动态规划)的更多相关文章

  1. HDU 1069 Monkey and Banana(动态规划)

    Monkey and Banana Problem Description A group of researchers are designing an experiment to test the ...

  2. HDU 1069 Monkey and Banana (动态规划、上升子序列最大和)

    Monkey and Banana Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  3. hdu 1069 Monkey and Banana 【动态规划】

    题目 题意:研究人员要测试猴子的IQ,将香蕉挂到一定高度,给猴子一些不同大小的箱子,箱子数量不限,让猩猩通过叠长方体来够到香蕉. 现在给你N种长方体, 要求:位于上面的长方体的长和宽  要小于  下面 ...

  4. 随手练——ZOJ 1093 Monkey and Banana(动态规划)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=93 一堆科学家研究猩猩的智商,给他M种长方体,每种N个. 然后,将一个 ...

  5. HDU 1069 Monkey and Banana (动态规划)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069 简单记录一下 思路:把长方体的各种摆法都存到数组里面,然后按照长宽排序,再dp即可 转移方程 d ...

  6. HDU 1069 Monkey and Banana dp 题解

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

  7. HDU——Monkey and Banana 动态规划

                                                                       Monkey and Banana Time Limit:2000 ...

  8. Monkey and Banana(HDU 1069 动态规划)

    Monkey and Banana Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  9. ZOJ 1093 Monkey and Banana (LIS)解题报告

    ZOJ  1093   Monkey and Banana  (LIS)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

随机推荐

  1. 使用dotnet Cli向nuget发布包

    长话短说, 今天分享如何在nuget.org创建并发布.NET Standard package. 前置 安装勾选.NET Core开发套件的Visual Studio; 安装dotnet Cli 从 ...

  2. DDD之4聚合和聚合根

    聚合就是归类的意思,把同类事物统一处理: 聚合根也就是最抽象,最普遍的特性: 背景 领域建模的过程回顾: 那么问题来了? 为什么要在限界上下文和实体之间增加聚合和聚合根的概念,即作用是什么? 如何设计 ...

  3. zabbix通过Web场景监控URL

    选择主机添加应用集       添加Web监控 选在相应主机,并添加Web监控 按照方式新建Web场景 注意: 名称统一规则:相应的域名 应用集:选择之前创建的 或者 新建一个,名称为“URL 告警” ...

  4. 详解 Seata Golang 客户端 AT 模式及其使用

    源码seata-golang 概述   我们知道 Seata Java Client 的 AT 模式,通过代理数据源,实现了对业务代码无侵入的分布式事务协调机制,将与 Transaction Coor ...

  5. 利用BeanMap进行对象与Map的相互转换

    javabean与map的转换有很多种方式,比如: 1.通过ObjectMapper先将bean转换为json,再将json转换为map,但是这种方法比较绕,且效率很低,经测试,循环转换10000个b ...

  6. HTML的简介和历史发展过程

    HTML的简介和历史发展过程 前言 这次写一篇对于HTML以及CSS的简介,平常我们大家都知道的编程语言有很多种,比如Java.C++.Python等等,每种编程语言都有其独具的特色,不论是语法格式还 ...

  7. SpringCloud Alibaba (一):序言

    为什么要转用SpringCloud Alibaba? Spring Cloud Netflix项目进入维护模式 在2018年底时,Netflix宣布Hystrix进入维护模式.自2016年以来,Rib ...

  8. cb27a_c++_STL_算法_最小值和最大值

    cb27a_c++_STL_算法_最小值和最大值min_element(b,e) b--begin(), e--end()min_element(b,e,op). op:函数,函数对象,一元谓词.ma ...

  9. selenium(1)-详细解读元素定位的八种方式

    安装selenium和下载webdriver 安装selenium pip install selenium pip install selenium  -U  (判断是否有最新版本) 下载drive ...

  10. <前端 js 实现 代码雨 >

    前端  js 实现 代码雨: <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...