bzoj 3873: [Ahoi2014]拼图

Description

 JYY最近迷上了拼图游戏。作为一个计算机科学家,JYY有一套黑白色的拼图,他希望通过合理的拼接,使得拼出的最终图案中,能包含面积最大的全白色子矩形。JYY一共有S块拼图,并且由1到S编号。编号为i的拼图是一个N行列的方格矩形,每个方格都为黑色或者白色。一开始JYY将他的这S块拼图按照编号顺序左右相连依次放在桌上拼成了一个N行M列(这里M=Sigma(Wi)(1<=i<=S)的大矩形。之后JYY发现,可以通过改变这S块拼图的连接次序,使得拼成的N行M列的大矩形中,最大全白子矩形面积变大。现在JYY想知道,怎么拼才能得到最大的全白子矩形呢?请你帮助他计算出最佳的拼接方案。

Input

每个输入文件中包含多组测试数据。输入文件第一行包含一个整数T,代表

测试数据的组数,接下来按顺序描述了每组测试数据。
每组测试数据的第一行包含两个整数S和N。
接下来S组输入,第i组对应编号为i的拼图。
在第i组输入中,第一行包含一个整数;
接下来N行描述一个N行列的0/1矩形;
其中第x行y列为0则表示该拼图对应位置的颜色是白色,反之则为黑色。

Output

 对于每组数据输出一行包含一个整数ans,表示最大可能的全白色子矩形的面积。

Sample Input

1
34
4
1001
0000
0010
1001
3
000
010
000
011
2
00
10
01
00

Sample Output

6

HINT

对于100%的数据满足1<=S,N,Wi<=10^5,N*Sigma(Wi)<=10^5,T<=3

Source

By 佚名上传


JSOI第二轮D1T1

想想那时候第一次看到这题的感受。。简直不可做!写了个n!*n^2*log^2n的暴力【不要问我后面为何复杂度那么高。那时候不会n^3找最大子矩形】

然后就一直拖到了今天

丢是丢算法复合的分类里面了。。不过这到底算不算算法复合呢。。。

设M=sigma(Wi)

这题最后是有个乘积限定的,这意味着什么呢。我们也许可以根据N M的大小来复合算法

算法一:

我们枚举上下边界。然后看看这个边界可以穿过哪些矩形。这些都加起来。

然后再看看往左往右最多可以延伸多少。两边套两个最大延伸的矩形。然后用L*H求面积更新答案就可以了。

复杂度O(N^2M)

算法二:

当算法一的N过大时,那么算法一的复杂度我们就不能接受了。

这样我们想到了第二种算法。

可以发现最大的答案肯定上下都有1。

那么我们就可以先预处理出每个点往上延伸的最大距离。然后枚举每个点。再用M来统计哪些穿过哪些只能走一部分

然后更新答案就可以了

复杂度O(NM^2)

然后我们判断N是否大于√10^5

然后用算法一算法二分别处理就可以了。

记得处理如果最后答案在一个矩形内这种情况。上述方法并未考虑这种情况。

所以需要单独统计一下。

至此此题解决√

【感谢@taorunz @ydc】


后来我get了一种不用按照NM来分类的方法。

是参考@waltz719的。没问作者同不同意发表所以就不在这里发了。

因此我也不贴我的代码了。

【总之你们老老实实写第一种方法练练写代码能力吧!】


至此JSOI第二轮就差D2T2保龄球没有补全了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值