题解目录

  • 1.题目
  • 2.题意
  • 3.思路
  • 4.代码

1.题目

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

2.题意

给你n个长方体的长a宽b高c,每一个型号的长方体可以用无限多个。用这些长方体来堆一个高度最高的塔,每一个长方体的长宽大于上面一个长方体的长宽。

3.思路

一个长方形共有三种方法,n个就有3*n放法。 每一个长方体的长宽必须严格大于上面一个长方体的长宽,因此每次让底面的两条边,大的当做长,小的当做宽。对每个长方体进行结构体排序,先按照长度排,长相等按宽排(这样可以满足对要进行DP的积木块按底面积从大往小排)。接下来的问题就是找到一个递减的子序列,使得子序列的高度和最大即可。类似于最长不下降子序列 链接: 点击这里.
1.dp[i]表示表示以第i块积木为顶的塔的最大高度;
2.对于每个dp[i]有两种状态。
(1) 在dp[i]的前面可以找到dp[j] ( i<j ),即满足第i块积木的底面积小于第j块积 木的底面积,使得第i块积木可以放到第j块积木上形成更高的塔。状态转移方程 dp[i]=dp[j]+a[i].h. 。
(2) 在第i块积木的前面找不到符合条件的积木j,那么以它自己为塔最下面的积木块。dp[i]=a[i].h。(这也是初始边界)即每块积木以自己为塔底进行重新累积。
3.状态转移方程 dp[i] = max(dp[i], dp[j] + a[i].h)。

4.代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 105;
struct Node
{int x, y, h;
}a[maxn];
bool cmp(Node a, Node b)
{if (a.x != b.x)      先按照长度排return a.x > b.x;elsereturn a.y > b.y;   长相等按宽排
}
int dp[maxn];  //表示以第i块积木为顶的塔的最大高度
int main()
{int n, cas = 0;while (cin >> n && n){memset(dp, 0, sizeof(dp));int x, y, z;int k = 1;while (n--){cin >> x >> y >> z;a[k].x = max(x, y);   ///积木的长a[k].y = min(x, y);   ///积木的宽a[k].h = z;           ///积木的高k++;a[k].x = max(x, z);  a[k].y = min(x, z);  a[k].h = y;           k++;a[k].x = max(y, z);a[k].y = min(y, z);a[k].h = x;k++;}sort(a + 1, a + k, cmp);for (int i = 1; i < k; i++){dp[i] = a[i].h;      ///边界}int ans = 0;for (int i = 1; i < k; i++){for (int j = 1; j < i; j++){if (a[j].x > a[i].x&&a[j].y > a[i].y){dp[i] = max(dp[i], dp[j] + a[i].h); 状态转移方程}ans = max(ans, dp[i]);}}printf("Case %d: maximum height = %d\n", ++cas, ans);}return 0;
}

参考博客:链接: 点击这里.

Monkey and Banana HDU - 1069 [ 结构体排序+DP最长不上升子序列 ] 详细题解相关推荐

  1. 动态规划训练15 [Monkey and Banana HDU - 1069 ]

    Monkey and Banana HDU - 1069 题意大致是将一个长方体通过旋转,使得摞起来的建筑最高.但是必须满足这么一个条件,那就是上面的长方体的底面一定要完全被下一个长方体的底面完全覆盖 ...

  2. [kuangbin带你飞]专题十二 基础DP1 C - Monkey and Banana HDU - 1069

    C - Monkey and Banana HDU - 1069 题目链接:https://vjudge.net/contest/68966#problem/C 题目: A group of rese ...

  3. (动态规划 最长有序子序列)Monkey and Banana --HDU --1069

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1069 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  4. 【HDU】1862 EXCEL排序(结构体排序)

    Problem Description Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. Input 测试输入包含若干测试用例.每个测试用例的第1行包含两个整数 N (<= ...

  5. qvector 结构体排序_C++结构体的应用_YCOJ

    结构体是一种自定义的东西,用struct来定义.在他里面, 可以装许多东西,比如int,string,char,bool等等等等. 如: struct a{ string name; int a; i ...

  6. 还是贪心(结构体排序)

    2128: 盾神与积木游戏 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 127 Solved: 39 [Submit][Status][Web Boa ...

  7. sort对结构体排序

    1.排序方法: sort(数组起始指针,数组尾指针,排序规则); 数组起始指针,数组尾指针是左闭右开 排序规则可以省略,也可以用系统的,也可以自己写 2.例子: int a[]={9,2,4,5,10 ...

  8. P1068 分数线划定 洛谷 (C++)(结构体排序)

    简单的结构体排序,代码如下 #include <iostream> #include <cstdio> #include <algorithm> #include ...

  9. C#中结构体排序方法(Array.sort() + ICompare)

    感觉C#比C++麻烦许多,资料也少,找了半天竟然没有找到一个能用的结构体排序. 这是待排序的结构体: public struct la{public int id;public int sb;}; 首 ...

最新文章

  1. Interview:算法岗位面试—10.16下午—上海某公司算法岗位(偏图像算法,国内顶端医疗行业)技术面试之一点技术都没问
  2. SAP Fiori Elements里的SAP自定义注解annotation sap-text
  3. C#中使用NPIO实现导入导出Excel简单操作
  4. sql判断字段不为null_什么是NULL值
  5. 解决CMake Error : file does not recognize sub-command GL0B or GL0B_RECURSE 原因分析
  6. java cpu100 解决办法_[Java] CPU 100% 原因查找解决
  7. iOS 项目默认竖屏 个别页面横屏
  8. 搜索不到网络计算机和设备,电脑搜不到无线网络原因分析和对应解决办法
  9. 组态王与Modbus协议的地址对应规则
  10. 黄太吉如何把煎饼卖到4000万估值
  11. 第一章:计算机的软硬件基本结构_3
  12. 我的一个项目:项目可行性分析报告
  13. c语言实现登录注册功能
  14. crh寄存器_寄存器-相关博客帖子 - 电子工程世界-论坛
  15. 培养用户的数字化习惯
  16. nobody nogroup linux vi nfs,nfs挂载后权限映射错误(nobody)的解决办法
  17. SCADA/EMS系统的子系统的划分
  18. 新手小白学java 编码转换流 OutputStreamWriter InputStreamReader
  19. 反思 我和网站优化seo
  20. 双碑零基础西班牙语学习 从0开始的西班牙语常识

热门文章

  1. xvfb的安装、配置、运行(Linux)
  2. MySQL8.0允许远程连接
  3. oppop r1c怎么设置语言中文,OPPO R1 用起来怎么样?我们的读者给出了答案
  4. php 如何带数据重定向,PHP重定向如何实现数据不丢失?-PHP问题
  5. 程序员行业大洗牌?!
  6. Hbase面试题总结(大数据面试)
  7. 多模态大语言模型综述来啦!一文带你理清多模态关键技术
  8. 沈腾在微博晒出结婚证头像 宣布与王琦结婚
  9. 国内编程技术网站、论坛列表
  10. C 时钟控件 (C Clock Control)