Algorithm 如何求矩阵中回文的最大平方

Algorithm 如何求矩阵中回文的最大平方,algorithm,language-agnostic,dynamic-programming,Algorithm,Language Agnostic,Dynamic Programming,我试图解决一个问题,在这个问题中,我得到一个字符的nXn平方矩阵,我想从中找出最大回文平方的大小?最大的回文方块是,所有行和列都是回文方块 例如。 输入 输出将是: 3 对应于中间的正方形。我正在考虑动态规划的解决方案,但无法建立递推关系。我认为尺寸应该是a(I,j,k),其中I,j是矩形的右下角,k是回文正方形的大小。 有人能帮我解决这个问题的递归关系吗 编辑: n让我们从验证回文的复杂性开始: 回文可以在O(k)中识别,其中k是回文的长度 然后,您需要对r内部正方形中的每一行和每一列执行2

我试图解决一个问题,在这个问题中,我得到一个字符的nXn平方矩阵,我想从中找出最大回文平方的大小?最大的回文方块是,所有行和列都是回文方块

例如。 输入

输出将是:

3
对应于中间的正方形。我正在考虑动态规划的解决方案,但无法建立递推关系。我认为尺寸应该是a(I,j,k),其中I,j是矩形的右下角,k是回文正方形的大小。 有人能帮我解决这个问题的递归关系吗

编辑:


n让我们从验证回文的复杂性开始:

回文可以在
O(k)
中识别,其中k是回文的长度

然后,您需要对r内部正方形中的每一行和每一列执行2k次测试。(使用回文k的长度作为维度)

现在你有了
k*2k->O(2k^2)->O(k^2)

然后,您希望增加整个数据集的可能搜索空间
nxn
这是在引入第二个变量时

您需要在嵌套循环中迭代列
1到(n-k)
和所有行
1到(n-k)

现在你有了
(n-k)^2*O(k^2)->O(n^2*k^2)

注意:此问题取决于多个变量


这与我建议您对解决方案进行编码时所采用的方法相同,从小处开始,然后变大

我确信可能有更好的方法,而且我非常确信我的逻辑是正确的,所以从表面上看,这是未经测试的

为了简化这个例子,我要说i,j是左上角或坐标1,1

  1 2 3 4 5 6 7 8
1 a b c d e f g f 
2 d e f g h j k q 
3 a b g d z f g f 
4 a a a a a a a a
ie
(1,1)=a,(1,5)=e和(2,1)=d

现在,您可以先检查每一列,而不是检查每一列

k=3

1) 创建一个二维布尔数组,该数组的大小为字符表的所有结果均为TRUE

2) 我首先检查第3列
cfg
,它不是回文,因此我不再需要测试第1列或第2列

3) 因为回文测试失败,所以将2D数组(1,3)中的响应结果标记为FALSE(我知道不测试使用此位置的任何范围,因为它不是回文)

4) 接下来检查第6列,
fjf
,这是一个回文,所以我返回并测试第5列,
ehz
!=回文

5) 集合(1,5)=假

6) 然后测试第8列,然后测试第7列

注意:您只需测试8列中的5列

由于一行中有k列是回文,现在测试相应的行。在本例3中,从最下面一行开始,因为如果失败,它将消除大多数其他检查

7) 检查从(3,6)开始的行
fgf
=回文

8) 检查从(2,6)开始的行
jkq
!=回文

9) 集合(2,6)=假

10) 检查从(2,3)开始的列
daa
!=回文的

11) 集合(2,3)=假

不需要再测试第2行,因为(2,3)和(2,6)都为FALSE

希望你能理解这一点


注意:您可能会从
k=n
开始执行此操作,并递减k,直到找到结果为止,前提是您可以解决以下问题:

  • 在单元格
    (i,j)
    处结束是否存在水平和垂直长度不同的回文
以上问题提示:

boolean[][]回文//(i,j)有长度为k的回文吗
对于(int i=0;i
->有一个平方回文长度k,在(i,j)处结束


总的来说,时间复杂度将是O(n^3)

您可能还需要一对变量来记录您正在测试哪一列或哪一行的有效回文。确切地说,这就是我所坚持的,我希望在时间复杂度为O(n^3)的情况下进行测试。我仍然无法得到递归关系。这是一种幼稚的蛮力方法,我知道这一点,但我想知道这是否可以用比O(n^2*k^2)(在最坏的情况下是O(n^4))更好的动态规划来实现很抱歉,我应该编辑一个问题,即我不是在寻找蛮力的方法。公平地说,在这种情况下,你可以考虑检查每一行和列。然后,你只需要测试边行/列通过时的行列。可能将回文测试结果存储在2D中。array@Calcum对不起,我不能明白了,你能用你建议的新算法编辑你的答案吗?我真的很感谢你的帮助,但我真的不能完全理解所有这些。因为,1)我需要找到最大的这样的“k”,我没有得到一个。2)我仍然觉得你的代码是O(n^4)在最坏的情况下。我真的不能从表面上看这个问题。我真的不相信它的实现甚至可以达到n=200。在我的情况下,我必须处理非常好的解决方案。它奏效了。我每次都诅咒自己,我无法解决DP问题。@Naman很高兴它有帮助,你可能只需要一些练习,不要担心:)再次谢谢n、 如果你不介意的话,你也可以看看这个问题吗?我可以找到解决方案,但它是O(n^3)。我只是想知道它在O(n^2)中是否可能?根据问题描述,不要担心空间的复杂性。我很久以前就问过这个问题。@Naman你想要一个O(n^2)以上问题的时间复杂性?不,不是这个问题。我已经接受了这个答案。我问的是其他问题,是链接中给出的Skypscraper问题?
  1 2 3 4 5 6 7 8
1 a b c d e f g f 
2 d e f g h j k q 
3 a b g d z f g f 
4 a a a a a a a a