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. Python 爬虫之request+beautifulsoup+mysql

    一.什么是爬虫?它是指向网站发起请求,获取资源后分析并提取有用数据的程序:爬虫的步骤: 1.发起请求使用http库向目标站点发起请求,即发送一个RequestRequest包含:请求头.请求体等 2. ...

  2. 卷积生成对抗网络(DCGAN)---生成手写数字

    深度卷积生成对抗网络(DCGAN) ---- 生成 MNIST 手写图片 1.基本原理 生成对抗网络(GAN)由2个重要的部分构成: 生成器(Generator):通过机器生成数据(大部分情况下是图像 ...

  3. 第一个SpringMVC程序 (配置版)

    通过配置版本的MVC程序,可以了解到MVC的底层原理,实际开发我们用的是注解版的! 1.新建一个普通Maven的项目,然后添加web的支持 2.导入相关的SpringMVC的依赖 3.配置web.xm ...

  4. 商城05——首页轮播图显示实现&Redis环境搭建&Redis实现缓存

    1.   课程计划 1.首页轮播图的展示 2.首页大广告展示流程图 3.Redis的常用命令 4.Redis的服务器搭建 (集群的搭建) 5.向业务逻辑中添加缓存 6.Jedis的使用(redis的客 ...

  5. ca13a_c++_顺序容器的操作6删除元素

    /*ca13a_c++_顺序容器的操作6删除元素c.erase(p) //删除迭代器p指向的位置c.erase(b,e) //删除b to e之间的数据,迭代器b包括,e不包括c.clear()//删 ...

  6. Java 多线程基础(八)线程让步

    Java 多线程基础(八)线程让步 yield 一.yield 介绍 yield()的作用是让步.它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权:但是,并 ...

  7. EM(最大期望)算法推导、GMM的应用与代码实现

    EM算法是一种迭代算法,用于含有隐变量的概率模型参数的极大似然估计. 使用EM算法的原因 首先举李航老师<统计学习方法>中的例子来说明为什么要用EM算法估计含有隐变量的概率模型参数. 假设 ...

  8. lin-cms-dotnetcore功能模块的设计

    lin-cms-dotnetcore功能模块的设计 先来回答以下问题. 1.什么是cms? Content Management System,内容管理系统. 2.dotnetcore是什么? .NE ...

  9. idea 2018版/2019版的破解

    idea 2019版破解的穿越隧道:https://www.jianshu.com/p/09c9afae9a05 idea 2018版破解的穿越隧道:https://www.jianshu.com/p ...

  10. SpringBoot--集成actuator

    actuator是spring boot项目中非常强大一个功能,有助于对应用程序进行监视和管理,通过 restful api 请求来监管.审计.收集应用的运行情况,针对微服务而言它是必不可少的一个环节 ...