【题解】子数组

题目

题目描述

给出一个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

avatar

发现了吧,黄色块(1)的左边是一个从左下角的位置向右上方的斜坡,右边也一样,这意味着什么呢?

我们不妨只以红色(0)做栗子为什么不用蓝色做栗子,因为蓝色的栗子不好吃

是的,只要在下方形成一个底,那么这个矩形一定能沿着这个底向上延伸至最上方(因为没有黄色块挡着它)

来看看图:

假设我们选的是红块最下面的那块([8,1])

avatar

那么它可以延伸至顶部([1,1]),形成一个面积为8的矩形([8,1]到[1,1])

avatar

假设我们选的是([6,1]到[6,2])

avatar

那么它可以延伸至顶部([1,1]到[1,2]),形成一个面积为12的矩形([1,1]到[6,2])

avatar

栗子不用再举了吧,所以我们已经猜到解法了吧,是的,从下到上枚举,对于每一行,首先保证宽尽量大(0全选),接着用这个宽乘

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值