python 对最大子矩阵的求解
简单思路:使用暴力求解的方法 将每一个可能出现的子矩阵一一列出来并将他们子矩阵的大小存入ls列表中
对列表进行排序从而得出最大子矩阵的结果。
其中最重要的函数是EVEry和gxsa函数
def EVEry(a,b):
n = a + b
global Martixdic
global ls
Ans = 0
for i in range(a,len(ls)):
for j in range(b,len(ls[i])):
Ans = gxsa(i,j,a,b)
Martixdic[str(a) +str(b) +','+ str(i)+str(j)] = Ans
def gxsa(a,b,c,d):
global ls
number = 0
for i in range(c,a+1):
for j in range(d,b+1):
number = number + eval(ls[i][j])
return number
EVEry函数对矩阵中每个元素进行遍历,而gxsa嵌套在EVEry函数中对每个元素求对应的最小子矩阵的大小。
# -*- coding: utf-8 -*-
"""
Created on Wed Aug 11 10:25:49 2021
@author: 86150
"""
#
def Main():
global ls
global Martixdic
for i in range(len(ls)):
for j in range(len(ls[i])):
if i !=len(ls) and j != len(ls):
EVEry(i,j)
elif i == len(ls):
icount3(i,j)
elif j == len(ls):
jcount3(i,j)
elif i==len(ls) and j == len(ls):
Martixdic[str(i) +str(j) +','+ str(i)+str(j)] = eval(ls[i][j])
def EVEry(a,b):
n = a + b
global Martixdic
global ls
Ans = 0
for i in range(a,len(ls)):
for j in range(b,len(ls[i])):
Ans = gxsa(i,j,a,b)
Martixdic[str(a) +str(b) +','+ str(i)+str(j)] = Ans
def gxsa(a,b,c,d):
global ls
number = 0
for i in range(c,a+1):
for j in range(d,b+1):
number = number + eval(ls[i][j])
return number
def icount3(a,b):
n = a + b
global Martixdic
global ls
Ans = eval(ls[a][b])
for i in range(b,len(ls[a])):
Ans = Ans + (eval(ls[a][i]))
Martixdic[str(a) +str(b) +','+ str(a)+str(i)] = Ans
def jcount3(a,b):
n = a + b
global Martixdic
global ls
Ans = eval(ls[a][b])
for i in range(b,len(ls[a])):
Ans = Ans + (eval(ls[i][b]))
Martixdic[str(a) +str(b) +','+ str(b)+str(i)] = Ans
a = input("请输入所要生成的矩阵的大小以及各行各列的元素:\n")
line = a.replace('\n',',')
line = line.split(',')
del line[0]
Martixdic = {}
ls = []
for items in line:
ls.append(items.split(' '))
print(ls)
Main()
MArtix = list(Martixdic.items())
MArtix.sort(key = lambda x:x[1],reverse = True)
print(MArtix)
print("以上皆为测试内容\n\n")
print('该矩阵的最大子矩阵{}'.format(MArtix[0][1]))