【题意】
给定一个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。