输入是一个N * N的矩阵。输入的第一行给出N (0 < N <= 100)。 再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给出第二行的N个整数……)给出矩阵中的N2个整数,整数之间由空白字符分隔(空格或者空行)。 已知矩阵中整数的范围都在[-127, 127]。
输出最大子矩阵的大小。
4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2
15
def max_subarr_sum(arr): local_max = -float("inf") res = -float("inf") for num in arr: local_max = max(num, local_max + num) res = max(local_max, res) return res def solve(matrix): m, n = len(matrix), len(matrix[0]) res = -1 for i in range(n): for j in range(i, n): arr = [sum(matrix[k][i:j + 1]) for k in range(m)] res = max(res, max_subarr_sum(arr)) return res if __name__ == '__main__': n = int(input()) matrix = [] while n: matrix.append(list(map(int, input().split()))) n -= 1 print(solve(matrix))先求一维最大子序列,然后把双指针把矩阵压缩。
try: while True: num = int(input()) matrix = [] for i in range(num): matrix.append(list(map(int,input().split()))) maxSubMatrix = 0 for i in range(num): array = [0] * num #i行到j行之间同列的相加 for j in range(i,num): for q in range(num): #j每次加一array都会继承前面的,只有i变化时才重置array array[q] += matrix[j][q] temp = array[0] ans = array[0] for k in range(1,num): #对之前得到的i行到j行同列中找最大连续和 temp= max(temp+array[k],array[k]) ans = max(temp,ans) if maxSubMatrix < ans: maxSubMatrix = ans print(maxSubMatrix) except Exception: pass