0.我为什么要写这篇博客
因为我太菜了,网上其他的有关于这道题的博客全都看不懂
而且写博客的人都比较巨,比如说 k a i s e r kaiser kaiser神仙(orz您)
后来我在 a k i o i akioi akioi的 g j m gjm gjm的帮助下理解了这道题(IOI选手果然是轻松切掉ctsc题)
1.O(nm^4)算法
题目大意就是给你一个 n × m n\times m n×m的01矩阵,让你求出最大的完全由0构成的 I I I字形区域的面积
这道题我们很明显可以把问题简化一下,变成处理三个矩形,那么状态我们就设计出来了
f [ i ] [ j ] [ k ] [ l ] ( l = 1 , 2 , 3 ) f[i][j][k][l](l=1,2,3) f[i][j][k][l](l=1,2,3)表示我们现在取第 i i i行的 [ j , k ] [j,k] [j,k]这一段,作为第 l l l个矩形的一部分
为了判断这一段是不是全是0,我们可以开一个数组 s u m [ i ] [ j ] sum[i][j] sum[i][j]表示第 i i i行,前 j j j个数的和
那么转移就差不多是这个样子的
f [ i ] [ j ] [ k ] [ l ] = m a x { f [ i − 1 ] [ j ] [ k ] [ l ] , f [ i − 1 ] [ x ] [ y ] [ l − 1 ] } + k − j + 1 ( s u m [ i ] [ k ] = s u m [ i ] [ j − 1 ] ) f[i][j][k][l]=max\{ f[i-1][j][k][l],f[i-1][x][y][l-1]\}+k-j+1(sum[i][k]=sum[i][j-1]) f[i][j][k][l]=max{
f[i−1][j][k][l],f[i−1][x][y][l−1]}+k−j+1(sum[i][k]=sum[i][j−1])
就是说,在第 i i i层这个区间的状态,可以通过上一层的继承过来,也可以通过上一个矩形的一个区间继承过来,这个区间需要满足相应的条件(我们下面说),在加上这一区间的长度,因为我们每次只扩展一行
这样的话我们会得到一个 O ( n m 4 ) O(nm^4) O(nm4)的算法,但是 n ≤ 200 n\leq200 n≤200我们至少要把他优化到 O ( n m 2 l o g ) O(nm^2log) O(nm2log)级别(当然这道题很明显不带 l o g log log)
2.O(nm^2)算法
2.1 g数组
这里我们看一下, I I I是一个什么样的结构,比如说我们设这3个矩形的左右端点分别是 [ l 1 , r 1 ] [l_1,r_1] [l1,r1], [ l 2 , r 2 ] [l_2,r_2] [l2,r2], [ l 3 , r 3 ] [l_3,r_3] [l3,r3](高度我们先不管他)
那么,为了满足 I I I字形的条件,中间那个矩形要比两边的都要窄,也就是说
l 1 < l 2 ≤ r 2 < r 1 , l 3 < l 2 ≤ r 2 < r 3 l_1<l_2\leq r_2<r_1,l_3<l_2\leq r_2<r_3 l<

最低0.47元/天 解锁文章
1462





