最大全1子矩阵 DP

【题意】


给定一个01矩阵,求其最大的全1子矩阵。


【思路】


DP。


【HDU1506】


Problem Address:http://acm.hdu.edu.cn/showproblem.php?pid=1506


这道题可以转为为求一维数组里相应的最大值。

首先用两个数组L[ ], R[ ]分别记录某个点左边和右边比它本身大的范围。

比如数列:3 2 4 1(标号从1开始)

则L[2] = 1,R[2] = 3,表示数组1到3的范围内的数都不比第二个数小。

处理完之后枚举每一个点,则每个点的值为V[i] = (R[i]-L[i]+1)*a[i]。

则V[2] = (R[2]-L[2]+1)*a[2] = (3-1+1)*2=6,表示以第二个数为中心的点所能形成的最大矩阵为6。


【HDU1505】


Problem Address:http://acm.hdu.edu.cn/showproblem.php?pid=1505


将R的点取值为0,F的点取值为1。则题目要求01矩阵的最大全1子矩阵。

假设一01矩阵如下:

1011

0011

1011

1101

则按列将其转化为如下矩阵:

1011

0022

1033

2004

即某个点的值表示该点向上有多少个连续的1。

然后对于每一行进行前一道题的运算,再取其最大值即为最终结果。


【HDU2870】


Problem Address:http://acm.hdu.edu.cn/showproblem.php?pid=2870


与前一道题相似,只需做一下变化。

维护三个矩阵,分别表示a、b、c的取值情况。

若某个点为a、w、y、z,则a矩阵该点为1,否则为0。

若某个点为b、w、x、z,则b矩阵该点为1,否则为0。

若某个点为c、x、y、z,则c矩阵该店为1,否则为0。

不需要维护w、x、y、z矩阵,因为那些矩阵已经包含在a、b、c中。

然后对于每一个矩阵,进行上一道题的运算,再取其最大值即为最终结果。


【HDU2830】


Problem Address:http://acm.hdu.edu.cn/showproblem.php?pid=2830


也是求最大全1子矩阵,但是附加条件是列可变换。

第一步与前面的题类似,将矩阵:

1011

0011

1011

1101

转化为:

1011

0022

1033

2004

第二步则不同。

对每一行进行排序。

假设第三行,排序结果为:3 3 1 0。

则计算这个数列所能形成的如第一题的最大值。

由于该数列已排序,不需要进行左右的记录。

第一个数,其值为:3*1 = 3 。

第一个数,其值为:3*2 = 6 。

第一个数,其值为:1*3 = 3 。

第一个数,其值为:0*4 = 0 。

最大值为6,表示可以取到最大值为6。

而第一行结果为2,第二行结果为4,第四行结果为4,所以最终结果为6。

即,由第三行为止的两个3组成的矩阵,其中3表示该列该点以上有多少个连续的1。



你可能感兴趣的:(最大全1子矩阵 DP)