加入社区 登录
iDuel 享受决斗 返回首页

星塵★魂逍的个人空间 http://www.duelcn.com/?102586 [收藏] [复制] [RSS]

日志

【题解】石材切割

已有 297 次阅读2011-11-10 11:03 |个人分类:OI

PROBLEM 2.石材切割

 

问题描述:

某人得到一块N*M个小格的矩形石材(可能是玉石),经专家分析,把这个矩形石材的每个小格都有一个价值(使用一个绝对值不大于10的整数来描述),现在将这块石材切割成两块矩形石材,注意,切割只能与该矩形边平行,也就是说不能把矩形的小格切碎,假设每块矩形石材的价值为该矩形中所有小格子价值之和。

    问怎样切割,才能使得这两个矩形的价值乘积最大。如下图是一种比较好的切割方式。

输入格式:

输入文件BRICK.IN的第一行为2个正整数NM,表示石材被划分为N*M个格子。接下来N行,每行有M个整数,代表这个格子的价值。

 

输出格式:

输出文件BRICK.OUT只有一行,包含一个整数,为两个矩形的价值的最大乘积

 

输入样例

输出样例

3 4

-1 -1 -1 -1

0 0 0 0

-1 -1 -1 -1

16

 

数据范围

对于30%的数据,满足N,M5

对于100%的数据,满足N,M100。每个小格的伤害值的绝对值不超过10

一切数据及中间变量不超过longint范围。

做此题时脑子没有转过来,其实还是比较简单的,就是最大子矩阵的变种问题,首先题中需要的是两部分乘积,因此可以先把图划为2部分,再在两部分中分别求出最大,之后相乘记录最优,因为可以明确,划分为2部分必然是横着切一下或者竖着切一下。没有其他情况,所以可以分类讨论。就拿竖着切来说吧,可以先用平时求最大子矩阵的方法维护出一个f[i,j]表示第i列到第j列包含i,j边界的最大矩形的面积,这一个处理可以用N^3实现,之后枚举i1,j1,i2,j2求出最大的f[i1,j1]*f[i2,j2]敝人比较菜只会这么处理。。因为这是4方的枚举10^8有可能超时,不过这并不是严格的4方因为有j1>=i1,i2>j1,j2>=i2。想一下如果一个2方的枚举j<=i的话那么就是(1+2+3+......+n)=(n+1)*n/2的时间复杂度比普通的节省一半,所以这个4方枚举明显在5*10^7一下绝对不会超时的。。。实际上最慢的一个只用了0.1s

另外要注意的是此题还有负数,也就是说2个极小值相乘也可能最大,所以本题一共要分4类求解出最大。代码就不说了吧

评论 (0 个评论)

小黑屋|手机版|Archiver|中国OCG工作室

75a64a1a1491ffeda084b999386165e4

GMT+8, 2024-5-19 14:35 , Processed in 0.010845 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部