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,代表
Output
对于每组数据输出一行包含一个整数ans,表示最大可能的全白色子矩形的面积。
Sample Input
34
4
1001
0000
0010
1001
3
000
010
000
011
2
00
10
01
00
Sample Output
HINT
Source
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保龄球没有补全了。