悬线法
用途
求解满足条件的最大子矩阵。
定义
悬线:由一个点向下扩展所得到的合法线段。
L
(
i
,
j
)
L(i,j)
L(i,j):从
(
i
,
j
)
(i,j)
(i,j)向左扩展,最左端的合法位置。
R
(
i
,
j
)
R(i,j)
R(i,j):从
(
i
,
j
)
(i,j)
(i,j)向右扩展,最右端的合法位置。
U
(
i
,
j
)
U(i,j)
U(i,j):从
(
i
,
j
)
(i,j)
(i,j)向上扩展,最上端的合法位置,即以
(
i
,
j
)
(i,j)
(i,j)为下端点的悬线上端点。
推论:每一个点对应一条悬线,即以其本身为下端点的悬线。
初始化
首先,将
U
(
i
,
j
)
U(i,j)
U(i,j)全部赋值为1,即每条悬线长度均为1。
对于每一行的
L
(
i
,
j
)
L(i,j)
L(i,j)和
R
(
i
,
j
)
R(i,j)
R(i,j),先全部赋值为
j
j
j,然后枚举第
i
i
i行的合法情况,更新
L
(
i
,
j
)
L(i,j)
L(i,j)和
R
(
i
,
j
)
R(i,j)
R(i,j)。
状态转移
对于每个点
(
i
,
j
)
(i,j)
(i,j),若可以向上扩展,则
U
(
i
,
j
)
=
U
(
i
−
1
,
j
)
+
1
U(i,j)=U(i-1,j)+1
U(i,j)=U(i−1,j)+1
L
(
i
,
j
)
=
m
a
x
(
L
(
i
,
j
)
,
L
(
i
−
1
,
j
)
)
L(i,j)=max(L(i,j),L(i-1,j))
L(i,j)=max(L(i,j),L(i−1,j))
R
(
i
,
j
)
=
m
i
n
(
R
(
i
,
j
)
,
R
(
i
−
1
,
j
)
)
R(i,j)=min(R(i,j),R(i-1,j))
R(i,j)=min(R(i,j),R(i−1,j))
推论:每一条悬线对应一个子矩阵。
由上述内容可得,每个点对应一条悬线,每条悬线对应一个合法的子矩阵。
求解
枚举每一条悬线的下端点,其子矩阵边长分别为 R ( i , j ) − L ( i , j ) + 1 R(i,j)-L(i,j)+1 R(i,j)−L(i,j)+1、 U ( i , j ) U(i,j) U(i,j),计算其大小,更新答案即可。