HDU 1069 Monkey and Banana ——(DP)
简单DP。
题意:给出若干种长方体,如果摆放时一个长方体的长和宽小于另一个的长宽,那么它可以放在另一个的上面,问最高能放多少高度。每种长方体的个数都是无限的。
做法:因为每种个数都是无限,那么每种按照x,y,z分别重新排列可以得到6种长方体。现在用dp[i]表示选到第i个且第i个必须使用的最大高度,那么转移是从1~i-1中的dp中选一个能放在i的前面的最大值放在i的前面,再加上第i个的高,就得到了dp[i](如果一个都不能放在i的前面,那就只放i即可)。然后最终答案是dp[1]~dp[n]的最大值。
注意点是在dp前必须按照(x,y)先排序,这样可以保证第i个能够放在它前面的一定在1~i-1中(后面的一定x或y比它大)。
代码如下:
- #include <stdio.h>
- #include <algorithm>
- #include <string.h>
- #include <map>
- using namespace std;
- const int N = 1e7 + ;
- const int inf = 0x3f3f3f3f;
- struct node
- {
- int x,y,z;
- bool operator < (const node & temp) const
- {
- return x == temp.x ? y < temp.y : x < temp.x;
- }
- }p[];
- int dp[];
- int main()
- {
- int kase = ;
- int n;
- while(scanf("%d",&n) == && n)
- {
- for(int i=;i<=n;i++)
- {
- scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z);
- p[i+n] = (node){p[i].x,p[i].z,p[i].y};
- p[i+*n] = (node){p[i].y,p[i].x,p[i].z};
- p[i+*n] = (node){p[i].y,p[i].z,p[i].x};
- p[i+*n] = (node){p[i].z,p[i].x,p[i].y};
- p[i+*n] = (node){p[i].z,p[i].y,p[i].x};
- }
- sort(p+,p++*n);
- memset(dp,,sizeof dp);
- for(int i=;i<=*n;i++)
- {
- dp[i] = p[i].z;
- for(int j=;j<i;j++)
- {
- if(p[j].x < p[i].x && p[j].y < p[i].y && dp[j] + p[i].z > dp[i]) dp[i] = dp[j] + p[i].z;
- }
- }
- printf("Case %d: maximum height = %d\n",kase++,*max_element(dp+,dp++*n));
- }
- }
顺便考虑一个问题,如果要求的是最大能放几个长方体,那就是LIS的问题了。
HDU 1069 Monkey and Banana ——(DP)的更多相关文章
- HDU 1069 Monkey and Banana (dp)
题目链接 Problem Description A group of researchers are designing an experiment to test the IQ of a monk ...
- 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(DP——最大递减子序列)
题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=1069 题意描述: 给n块砖,给出其长,宽和高 问将这n块砖,怎样叠放使得满足以下条件使得 ...
- HDU 1069 Monkey and Banana (动态规划)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069 简单记录一下 思路:把长方体的各种摆法都存到数组里面,然后按照长宽排序,再dp即可 转移方程 d ...
- HDU 1069 Monkey and Banana(转换成LIS,做法很值得学习)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069 Monkey and Banana Time Limit: 2000/1000 MS (Java ...
- HDU 1069:Monkey and Banana(DP)
Monkey and Banana Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- HDU 1069 Monkey and Banana(二维偏序LIS的应用)
---恢复内容开始--- Monkey and Banana Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- 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 基础DP
题目链接:Monkey and Banana 大意:给出n种箱子的长宽高.每种不限个数.可以堆叠.询问可以达到的最高高度是多少. 要求两个箱子堆叠的时候叠加的面.上面的面的两维长度都严格小于下面的. ...
随机推荐
- VS2019编译 当前最新版chromium
之前编译过webrtc和chromium, 由于长时间没用,被我删除了, 最近在最新版本的google浏览器上遇到了播放器兼容性问题,老版本的google浏览器是没问题,IE, 火狐浏览器也没问题, ...
- java封装数据类型——Integer
今天来学习整型 int 的封装数据类型,Integer. 1. 定义 首先来看看定义.可以看到,Integer 继承 Number 抽象类,实现了 Comparable 接口.Number 类是常用数 ...
- java jdk1.8 API
里面有 中英文 jdk 1.8 API 还有 jdk1.6 和1.7 英文 API 链接:https://pan.baidu.com/s/1tchABVX7htJCaO3quENP1g提取码:y ...
- reduce方法的使用
reduce(收敛):接收一个回调函数作为累加器,数组中的每个值(从左到右)开始缩减,最终为一个值,是ES5中新增的又一个数组逐项处理方法. reduce(callback,initialValue) ...
- asp.net的web程序适用后台线程做异步任务
耗时的任务适用异步线程来完成. 像记录日志,发邮件,发短信,通知其他系统等.可以进行封装,让后台线程来完成,不过最好适用消息队列,redis缓存等中间件,适用定时任务来做.可以保证消息不丢失. usi ...
- java中的io流总结(二)——RandomAccessFile类
知识点:RandomAccessFile (随机访问文件)类 (一)描述 前一篇博客中https://www.cnblogs.com/shuaifing/p/11490160.html,主要描述Fil ...
- C#上传下载文件
方法一.通过Ajax方式上传文件(input file),使用FormData进行Ajax请求 <div > <input type="file" name=& ...
- 使用selenium实现站长素材图片采集
from selenium import webdriver import requests,os from lxml import etree from selenium.webdriver.chr ...
- STM32串口接收中断——基于HAL库
写在前面 最近需要使用一款STM32L4系列的芯片进行开发,需要学习使用HAL库.在进行串口中断使用的时候遇到了一些小麻烦,写下解决方案供大家参考. 1.UART相关的头文件引用错误 由于本人直接使用 ...
- [hdoj4578][多延迟标记的线段树]
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others)T ...