【不能用最小公倍数或最大值求覆盖子矩阵的宽和高!!】
昨天看了很久这个题,去POJ 的论坛上,看到几个分析说网上大多数的AC代码都是错的,只是POJ上的数据过于弱就过了,比如求行方向上最小覆盖的列数(宽度)只要用到求最小公倍数的就都是错的,希望大家做此题的时候注意一下,下面题解的时候会解释为什么是错的
题意:
给一个二维的字符串矩阵,求他的一个最小的子矩阵,使得无限个当前子矩阵的叠加可以覆盖此二维矩阵。(不知道这样说明易不易懂)
【换个说明方法:就是说这个最小子矩阵的平行叠加可以覆盖母矩阵,但是并不要求恰好覆盖,举例
ABABA ABABA这样一个矩阵,AB就是最小的子矩阵
ABABAB
ABABAB当六个此矩阵平行叠加时,原矩阵被覆盖在其中】
如图,蓝色为母矩阵,每个黄色的小方块是子矩阵,子矩阵的平行叠加可以覆盖母矩阵,但不需要是恰好覆盖,只要将母矩阵包含其中就可以了
题解:
1.首先可以证明,如果存在一个子矩阵满足要求,则起点在左上角的同等大小的子矩阵也满足要求。【自己领会一下】
2.【解释为什么求最小公倍数是错的】先看网上大部分代码的思路,求出横向每一行的最小的覆盖子串,长度分别是L1、L2......Ln,然后求n个数的最小公倍数就是最小宽度,如果最小公倍数大于母矩阵的宽,就让母矩阵的宽作为最小宽度
上面这种求法的宽度固然是一种解,但很有可能不是最小的,因为你每行都取最小的覆盖子串长度,但还有其他的满足条件的比较长的子串也满足要求,这时也许用其他的子串长度反而能取到更小的结果:
比如
两行的母矩阵,列宽为13,第一行的最小子串长度为3,但是4,5,6也满足要求,第二行的最小子串长度为4,此时若按照最小公倍数求法,3、4的最小公倍数为12,但是如果第一行不取最小子串,而是取更大的子串4,此时两行都是4,那只需要宽度为4 的子矩阵就能满足要求了,远远低于之前的12
再比如,举个实例:
2 8
ABCDEFAB
AAAABAAA
第一行子串宽度6,8都可,第二行子串最小为5,但是6,7,8也可以满足要求,这时取6,6的组合就远比取6,5的组合要好
但是这里我并不否认求最小公倍数这一思路,但是用最小公倍数的方法的话,就需要把所有情况的最小公倍数都求出来,取最小的,而不是每行取最小宽度再求公倍数就