Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python在矩阵动态规划中寻找最大平方_Python_Algorithm_Dynamic Programming - Fatal编程技术网

Python在矩阵动态规划中寻找最大平方

Python在矩阵动态规划中寻找最大平方,python,algorithm,dynamic-programming,Python,Algorithm,Dynamic Programming,我有一个矩阵如下(Python): matrix=”“” ……好……好 ……噢。。。。 ……啊……啊 …哦,哦。。 o、 ……哦。。。。 .oo。。。。。。 啊,啊。 .oo。。。。。。 ......... """ 其中“o”是一个障碍,我需要找到矩阵中最大的正方形。 并将相应的“.”替换为下面的“x” “”“ xxxo..o.o.o xxxoo。。。。 xxxo…o …哦,哦。。 o、 ……哦。。。。 .ooxxxx。。 …OxxxO。 .ooxxxx。。 …xxxx。。 "" 在这里发现

我有一个矩阵如下(Python):

matrix=”“”
……好……好
……噢。。。。
……啊……啊
…哦,哦。。
o、 ……哦。。。。
.oo。。。。。。
啊,啊。
.oo。。。。。。
.........
"""
其中“o”是一个障碍,我需要找到矩阵中最大的正方形。 并将相应的“.”替换为下面的“x”

“”“
xxxo..o.o.o
xxxoo。。。。
xxxo…o
…哦,哦。。
o、 ……哦。。。。
.ooxxxx。。
…OxxxO。
.ooxxxx。。
…xxxx。。
""

在这里发现了类似的问题(所以),但没有任何帮助。

正如我之前所建议的,如果您可以建立一个正确的数据结构,首先包含所有数量的连续点,然后从那里开始工作,那么就更容易找到解决方案。下面是示例代码来说明这一点:(第1部分回答这里,第2部分-作为练习离开)此代码采用另一个S/O帖子(@AlainT),并相应修改以适合此问题/格式。 (顺便说一句,您的代码示例根本不起作用,可能是格式问题?)

def bigSquare(矩阵):
spanSize=[矩阵中行的列表(映射(len,row.split(“o”)))]
#打印([s代表s,如果s>0,则s代表s,如果s>0,则s代表s])#您的数字数组
跨距=[[c代表ss中的s
对于范围为(s,-1,-1)的c)]
适用于跨度尺寸的ss
]
#打印(f'跨距:{spans}')
结果=(0,0,0,0,0)#面积、高度、宽度、顶部、左侧
对于r,枚举中的行(跨度):
对于范围内的c(长(行)):
nextSpans=累计((第[c]行表示第[r]行中的第[c]行),最小值)
rectSize=max([(w*h,h,w)表示枚举中的h,w(nextspan,1)])
打印(r、c、矩形尺寸)
结果=最大值(结果,矩形尺寸+(r,c))
返回结果[0]#返回正方形区域
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
矩阵=['…o..o.o',
“……哦……”,
“……哦……哦”,
“……哦……哦……”,
“哦……哦……”,

“.oo……”,#可以使用动态规划以
O(n²)
的复杂度来完成。其思想是,只有当向上、向左和向上向左的正方形具有相同的尺寸时,你才有一个更大的正方形。否则,当前单元格的最大平方就是上述正方形中最小的正方形,增加1。 代码如下:

matrix = """
   ...o..o.o
   ...oo....
   ...o....o
   ..o.ooo..
   o........
   .oo......
   ..o....o.
   .oo......
   .........
"""

matrix = [list(r) for r in matrix.split()]
        
dp = [[0] * len(matrix) for _ in range(len(matrix))]
# max_square_dim, row, column
max_squares = [(0, None, None)]

for ri, r in enumerate(matrix):
    for ci, c in enumerate(r):
        dp[ri][ci] = 0 if c == 'o' \
            else (1 if ri == 0 or ci == 0 
            else min(dp[ri - 1][ci], dp[ri][ci - 1], dp[ri - 1][ci - 1]) + 1)
        
        max_squares = [(dp[ri][ci], ri, ci)] if dp[ri][ci] > max_squares[0][0] \
            else (max_squares + [(dp[ri][ci], ri, ci)] if dp[ri][ci] == max_squares[0][0]
            else max_squares)
            

for max_square in max_squares:
    for r in matrix[max_square[1] - max_square[0] + 1:max_square[1] + 1]:
        r[max_square[2] - max_square[0] + 1:max_square[2] + 1] = ['x'] * max_square[0]
      
result = '\n'.join([''.join(r) for r in matrix])
        
print(result)
最后,当您必须用所有
x
s替换最大正方形时,只需检索最大正方形右下角顶点的索引(存储在
max\u square
)并进行列表替换



编辑:如果您有多个最大正方形,而不是声明单个的
max\u square
,您有一个它们的列表(在更新代码中,我将其重命名为
max\u squares
)然后,每次遇到一个与最大值相同的正方形时,你只需把它附加到<代码> Max方格。但是,考虑重叠方格的可能性。

你可以建立一个包含连续点的数目的矩阵,那么它就更容易做测量。你能给我们看看你现在得到的是什么吗?DanielHao更新了这个问题。@DanielHao第二部分,我的代码(上面的链接)是否可行?问题不是-你再次运行了吗?它显示了错误…让我们看看。它可以工作,谢谢。但是如果我有多个(大)相同大小的正方形,会发生什么情况?我能否根据其位置(顶部、底部)分别高亮显示等等?没有考虑多个正方形,请参阅编辑和新代码。太好了!不过,最后一个问题是,如果我想选择两个正方形之间的(左上)正方形,那么我应该选择
max_squares[0]
right?确切地说,矩阵是从顶部逐行访问的,从左侧逐列访问的。