POJ2185_Milking Grid_KMP_二维求最小覆盖子矩阵

博客探讨了POJ2185问题,解释了为何使用最小公倍数求解子矩阵宽度不是最优方法,并提出了通过KMP算法解决纵向最小高度的方法。通过分析不同子串覆盖情况,提出了一种优化算法,避免了最小公倍数可能导致的时间超限问题。
摘要由CSDN通过智能技术生成

【不能用最小公倍数或最大值求覆盖子矩阵的宽和高!!】


昨天看了很久这个题,去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的组合要好

但是这里我并不否认求最小公倍数这一思路,但是用最小公倍数的方法的话,就需要把所有情况的最小公倍数都求出来,取最小的,而不是每行取最小宽度再求公倍数就

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值