[python实践]非numpy库实现最小子矩阵的计算

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]))
        
    

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戚风蛋糕`

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值