POJ2185 最小覆盖矩阵

博客探讨了如何找到字符矩阵的最小覆盖矩阵,通过求解每一行和每一列的最小覆盖子串长度,并计算它们的最小公倍数。当行或列的最小公倍数大于等于原矩阵尺寸时,说明原矩阵即为最小覆盖矩阵。
摘要由CSDN通过智能技术生成

给定一个由字符组成的矩阵,求出它的面积最小的覆盖矩阵。

最小覆盖矩阵类似于最小覆盖子串,只不过是扩展到二维而已。

最小覆盖子串必定是原串的前缀,对于矩阵,可以求出每一行的最小覆盖子串的长度,只要对这些长度求最小公倍数,就可以获得最小覆盖矩阵的宽度。

同理,求出每一列的最小覆盖子串的长度,再求最小公倍数,就可以获得最小覆盖矩阵的高度了。

这里有一个地方要注意,如果求最小公倍数的过程中发现“行最小公倍数>=原矩阵宽度“时,可以确定最小覆盖矩阵的宽度与原矩阵一样。列也是一样的道理。因为原矩阵必定是它自己的覆盖矩阵。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

char str[10001][76];
int nxt[10001];
int r, c;
int lcmr, lcmc;

int gcd(int x, int y)
{
	if (x < y) return gcd(y, x);
	if (y == 0) return x;
	return gcd(y, x % y);
}

int lcm(int x, int y)
{
	return x / gcd(x, y) * y;
}

void getRowNext(int p)
{
	nxt[0] = -1;
	int i = 0, j = -1;
	while (i < c)
	{
		if (j == -1 || str[p][i] == str[p][j])
		{
			++i;
			++j;
			nxt[i] = j;
		}
		else j = nxt[j];
	}
}

void getCol
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值