题意:给你一个字符矩阵,求出它的最小覆盖子矩阵,即使得这个子矩阵的无限复制扩张之后的矩阵,能包含原来的矩阵。 即二维的最小覆盖子串。
一看这题,容易想出一种很直观的做法:求出每一行的最小重复串长度,取所有行的最小重复串长度的lcm为宽;对列也同样操作求出高。这种想法虽然很直观,但是否正确呢?
事实上,这种算法并不是正确的。如下面的这个反例:
2 8
ABCDEFAB
AAAABAAA
对于这个例子:第一行为6,第二行为5,6与5的最小公倍数为30,大于8则取8为宽,但明显是错误的。
但由于poj的测试数据太弱,以致使用这种方法的程序也可以通过。
下面介绍一下正解的做法。
首先是确定宽度:我们分别求出每行所有可能的重复子串长度,例如对于aaaa就有1、2、3和4,然后取每行都有的重复子串长度中最小的作为宽。
例如,对于上面的例子,第一行的重复子串长度只可能是6或8(显然整个串为一个重复子串也是可以的),第二行则可能是5、6、7或8,那么取它们都有的6和8当中最小值6,就是最小覆盖子矩阵的宽。
考虑到每行的列数比较小,1≤C≤

博客探讨了如何解决POJ 2185问题,即寻找字符矩阵的最小覆盖子矩阵。通过KMP算法,分别确定矩阵的宽度和高度。宽度通过找出每行的公共重复子串长度来确定,而高度则通过对行进行KMP匹配找到循环节长度。文章指出,虽然直观的算法可能在某些情况下有效,但存在错误,并提供了正确解法的时间复杂度分析。
405

被折叠的 条评论
为什么被折叠?



