hdu 1069 Monkey and Banana

2023-11-10

Problem

acm.hdu.edu.cn/showproblem.php?pid=1069

Reference

www.cnblogs.com/kuangbin/archive/2011/08/04/2127291.html

题意

给 n 种块,每种无限多个,求能搭起来的最高的高度。

每种块都是长方体,给出三维(x,y,z),每个块都可以任选一个面做底面。

一个块能放在另一个块上面,当且仅当上面的块的底面的两维都分别 严格小于 下面的块的底面的两维。(最下面是地面,无限大)

Analysis

每种块分别选它的三维当高,能摆出三种(因为数量少,有重复也不考虑去重,好写)。当选了一维当高以后,约定:剩下的两维中较短的为宽,较长的为长。

开始想到的DP方案是:dp[i][j][k]:用前 i 种块,当前底面为 j * k 时的最高高度

转移方程:dp[i][j][k] = max { dp[i][j][k], dp[i-1][ block [i].width ][ block [i].length ] + block [i].height }

在输入完后,要加多一个底面两维比所有块的三维的长度都要长、高为 0 的虚块,当作地面。

但因为题目没给出三个维度的长度的范围,数组大小不好估计,所以开大了会MLE,开小了会数组越界。而且就算给了范围,只要范围大些就开不了那么大的数组。

于是换一种方案:dp[i]:最下面放第 i 种块的时候能搭出的最高高度

状态转移:dp[i] = max { dp[j] + block [i].height | block [j].width < block [i].width && block [j].length < block [i].length }

Source code

1. MLE / RE (ACCESS_VIOLATION )

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int LEN = 10000, N = 30;

struct block
{
	int x, y, z; // x: width, y: length, z: height
	block() {}
	block(int _x, int _y, int _z): z(_z)
	{
		if(_x > _y)
			x = _y, y = _x;
		else
			x = _x, y = _y;
	}
} b[N*3];
int dp[LEN+2][LEN+2];

int main()
{
	int n;
	for(int kase=1, big=0, top=0; scanf("%d",&n),n; ++kase, big=top=0)
	{
		for(int i=0, x, y, z; i<n; ++i)
		{
			scanf("%d%d%d", &x, &y, &z);
			b[top++] = block(x, y, z);
			b[top++] = block(x, z, y);
			b[top++] = block(y, z, x);
			big = max(max(big, x), max(y, z));
		}
		++big; // 比最大的长度还要大1,保证放得下最大的底面
		memset(dp, 0, sizeof dp);
		for(int l=1; l<=big; ++l)
			for(int w=1; w<=l; ++w)
				for(int i=0; i<top; ++i)
					if(b[i].x<w && b[i].y<l)
						dp[w][l] = max(dp[w][l],
							dp[b[i].x][b[i].y] + b[i].z);
		printf("Case %d: maximum height = %d\n", kase, dp[big][big]);
	}
	return 0;
}

2. Accepted

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 30;

struct block
{
	int x, y, z, dp;
	block() {}
	block(int _x, int _y, int _z): z(_z), dp(_z)
	{
		if(_x < _y)
			x = _x, y = _y;
		else
			x = _y, y = _x;
	}
	bool operator < (const block &bk) const
	{
		return x < bk.x && y < bk.y;
	}
} b[N*3+1];

inline bool cmp(const block &a, const block &b)
{
	return a.x!=b.x ? a.x<b.x : a.y<b.y;
}

int main()
{
	ios::sync_with_stdio(false);
	for(int n, kase=1; cin>>n, n; ++kase)
	{
		int big = 0;
		for(int i=0, j=0, x, y, z; i<n; ++i)
		{
			cin >> x >> y >> z;
			b[j++] = block(x, y, z);
			b[j++] = block(y, z, x);
			b[j++] = block(z, x, y);
			big = max(max(big, x), max(y, z));
		}
		b[3*n] = block(big, big, 0);
		sort(b, b+3*n+1, cmp);
		int ans = 0;
		for(int i=1; i<=3*n; ++i)
		{
			for(int j=0; j<i; ++j)
				if(b[j] < b[i])
					b[i].dp = max(b[i].dp,
						b[j].dp + b[i].z);
			ans = max(ans, b[i].dp);
		}
		cout << "Case " << kase << ": maximum height = " << ans << '\n';
	}
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hdu 1069 Monkey and Banana 的相关文章

  • 静态只读字符串数组

    我在我的 Web 应用程序中使用静态只读字符串数组 基本上数组有错误代码 我将所有类似的错误代码保存在一个数组中并检查该数组 而不是检查不同常量字符串中的每个错误代码 like public static readonly string m
  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • 计算 XML 中特定 XML 节点的数量

    请参阅此 XML
  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • 以编程方式读取 SQL Server 查询计划建议的 SQL 特定执行的索引?

    如果我在 SSMS 中运行此命令 set showplan xml on GO exec some procedure arg1 arg2 arg3 GO set showplan xml off GO 我获得查询执行中涉及的完整调用堆栈的
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 为什么从字典中获取时会得到 Action<> 的克隆?

    我有以下字典 private Dictionary
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析

随机推荐

  • [搬运]台湾大学机器学习课程 by 李宏毅

    最近看到一个比较好的机器学习课程 大致听了一遍 整体感觉机器学习领域还是比较难 虽然李宏毅老师讲得还是挺好的 没有足够基础吸收起来还是有一定困难 即便是已经把过程讲了一遍 也很难理解到那些理论是如何构建起来的 这个课程一个好是讲到了当前最热
  • 科目一考试系统服务器奔溃,科目一错误率最高的题 学员都崩溃了

    2017 02 28 09 07 59 做错这种基础题目的时候 与其有时间责怪出题人套路太深 不如反省一下自己为什么做题的时候没有多看选项一眼 在学习科目一的时候 很多学员都对科目一的题目感到头疼 有的是因为交通法规太难背 有的是对绕人的题
  • css video 样式,使用CSS修改 video 标签默认样式

    使用CSS修改 video 标签默认样式 时间 2019 11 08 17 42 14 来源 作者 效果展示 1 模拟直播 去除进度条 当前观看时间 剩余时间 效果 2 去除 video 标签全部控件 效果 Tags CSS 点击 评论 声
  • 10x倍加速PDE的AI求解:元自动解码器求解参数化偏微分方程

    研究背景 科学和工程中的许多应用需要求解具有不同方程系数 不同边界条件甚至不同求解域形状的偏微分方程 Partial Differential Equation PDE 即需要求解一个方程族而不是单个方程 这类应用经常在反问题求解 控制和优
  • 关于RxJava最友好的文章

    本篇文章已授权微信公众号 guolin blog 郭霖 独家发布 RxJava到底是什么 让我们直接跳过官方那种晦涩的追求精确的定义 其实初学RxJava只要把握两点 观察者模式和异步 就基本可以熟练使用RxJava了 异步在这里并不需要做
  • urllib.request.urlopen详解

    视频链接https www bilibili com video BV1Us41177P1 p 2 requests get详解见 https blog csdn net qq 41845823 article details 119516
  • 基于Multisim的四人抢答器设计与仿真

    功能 1 抢答器最多可供4名选手参赛 编号为1 4号 各队对应用一个按钮S1 S4中一个控制 并设置一个清零和抢答控制开关S5 该开关由主持人控制 2 抢答器具有锁存功能 直到主持人 清零 3 开关S作为清零及抢答控制开关 由主持人控制 当
  • 关于Navicat 报错1251连接不成功Mysql

    使用Navicat 连接数据库时候出现1251错误 解决方法 1 首先打开mysql exe 然后输入密码 mysql exe可以在安装的位置搜索一下 2 输入ALTER USER root localhost IDENTIFIED WIT
  • C#WinForm界面: 使用IrisSkin4实现美化换肤

    记录IrisSkin4应用过程 方便以后参考 步骤一 在网上下载IrisSkin4 dll和它的皮肤文件 步骤二 复制以下两个文件到winfrom项目的Debug文件夹下 步骤三 引用IrisSkin4 dll文件 步骤四 在工具箱空白处点
  • 数字图像处理(冈萨雷斯 第三版)

    1 1 图像与图像处理的概念 图像 Image 使用各种观测系统以不同形式和手段观测客观世界而获得的 可以直接或间接作用于人眼并进而产生视觉的实体 包括 各类图片 如普通照片 X光片 遥感图片 各类光学图像 如电影 电视画面 客观世界在人们
  • MySQL——索引详解

    目录 一 为什么要有索引 二 什么是索引 三 索引的原理 四 MySQL的存储引擎 五 索引的数据结构 六 聚簇和非聚簇索引 七 索引的设计原则 一 为什么要有索引 一般的应用系统 读写比例在10 1左右 而且插入操作和一般的更新操作很少出
  • 系统分析中的决策问题

    例如你设计一个图书馆系统支持用户预订被借出的书籍 有两个解决方案 一是 每一本书被归还时校验是否有人预订 如有预订则以某种方式如短信等通知预订客户 同时书籍做另类处理不会被流入馆内以节省时间 但是问题是预订的客户要来走一个预订的流程即管理员
  • 【B站】动态规划学习

    https www bilibili com video BV1ET4y1U7T6 p 6 spm id from pageDriver 暴力递归到动态规划 测试用例 include
  • 基于STM32F103C8T6的超声波模拟雷达设计。【C8T6最小系统板+标准固件库+1.8‘TFT-LCD屏】

    前言 之前为做毕设一直在网上浏览关于STM32单片机的DIY项目 大多数设计都是关于智能家居方面的应用 通过浏览不同平台的内容发现了一个采用超声波测距并通过屏幕反馈障碍物位置的模拟雷达设计 感觉很有创意 但网上关于此项目的内容大多都是采用a
  • 手撕 AVL 树——C++ 高阶数据结构详解

    目录 传统艺能 概念 AVL 树结构定义 数据插入 AVL 树旋转 左单旋 右单旋 左右双旋 右左双旋 验证 AVL 树 查找 删除 传统艺能 小编是双非本科大一菜鸟不赘述 欢迎各位指点江山 期待 QQ 1319365055 此前博客点我
  • 四、FTP服务

    四 FTP服务 FTP服务是Internet上最早应用于主机之间进行数据传输的基本服务之一 是目前Internet上使用最广泛的文件传送协议 FTP概述 ftp是典型的C S架构的应用层传输协议 需要由服务端软件 客户端软件两个部分共同实现
  • TCP是怎么处理长连接、短连接

    TCP 协议是一种面向连接的协议 即在通信双方之间建立连接后才能开始传输数据 TCP 协议通过三次握手建立连接 在连接建立后就可以保持长时间的连接 以实现长连接 在 TCP 协议中 数据被分成多个数据包进行传输 每个数据包都有序号和确认应答
  • mac idea spark运行报错WARN Utils: Service ‘sparkDriver‘ could not bind on port 0. Attempting port 1.

    报错截图如下 在hosts里加入 本机ip 机器名 如 192 168 22 22 centos7 解决 原因是sparkDriver会根据主机名去找地址 找不到就报错 增加环境变量即可 SPARK LOCAL IP 127 0 0 1 也
  • efficientdet在gpu训练好的模型无法再cpu上使用

    AssertionError The NVIDIA driver on your system is too old found version 9010 Please update your GPU driver by downloadi
  • hdu 1069 Monkey and Banana

    Problem acm hdu edu cn showproblem php pid 1069 Reference www cnblogs com kuangbin archive 2011 08 04 2127291 html 题意 给