题目
题目描述
给出一个N行N列的二维数组,元素只取0,1,2这三种值,并且每行、每列的元素值单调不下降。在此数组中,找出一个值全部等于0或者全部等于2的子二维数组,使得这个子数组的元素个数最多。子二维数组是指行数、列数不超过N的连续的一个矩形区域。
输入格式
第1行:1个整数N,表示二维数组的行数和列数。行的编号从1到N,列的编号从1到N。
接下来N行,每行两个整数P1和P2。P1表示在该行中第1个1所在的列编号。如果该行没有1,则P1=0. P2表示该行中第1个2所在的列编号。如果该行没有2,则P2=0
输出格式
第1行:1个整数,表示最大的值全部等于0或者全部等于2的子二维数组的元素个数
第2行:1个整数,表示元素个数为最大值的子数组一共有多少个
注意,如果没有满足题意的子数组,在第1行和第2行上均输出0
样例
样例输入
8
4 0
4 8
4 8
3 7
3 6
3 5
2 3
0 2
样例输出
12
4
数据范围与提示
样例说明
输入数据描述的二维数组是这样的:
0 0 0 1 1 1 1 1
0 0 0 1 1 1 1 2
0 0 0 1 1 1 1 2
0 0 1 1 1 1 2 2
0 0 1 1 1 2 2 2
0 0 1 1 2 2 2 2
0 1 2 2 2 2 2 2
0 2 2 2 2 2 2 2
可以看出,一共有4个值全部相同的子二维数组,分别是:(1,1)到(6,2);(5,6)到(8,8); (7,3) 到 (8,8); (6,5)到(8,8).
【数据范围】 1<=N<=5000
题目描述里面有十分重要的一句话
每行、每列的元素值单调不下降
这可能还有一点抽象,那么看看根据样例画出来的图:
红:0,黄:1,蓝:2
发现了吧,黄色块(1)的左边是一个从左下角的位置向右上方的斜坡,右边也一样,这意味着什么呢?
我们不妨只以红色(0)做栗子为什么不用蓝色做栗子,因为蓝色的栗子不好吃
是的,只要在下方形成一个底,那么这个矩形一定能沿着这个底向上延伸至最上方(因为没有黄色块挡着它)
来看看图:
假设我们选的是红块最下面的那块([8,1])
那么它可以延伸至顶部([1,1]),形成一个面积为8的矩形([8,1]到[1,1])
假设我们选的是([6,1]到[6,2])
那么它可以延伸至顶部([1,1]到[1,2]),形成一个面积为12的矩形([1,1]到[6,2])
栗子不用再举了吧,所以我们已经猜到解法了吧,是的,从下到上枚举,对于每一行,首先保证宽尽量大(0全选),接着用这个宽乘