n=int(input()) mat=[] for _ in range(n): mat.append([int(i) for i in input().split()]) m,n=len(mat),len(mat[0]) pre=[[0]*(n+1) for _ in range(m+1)] for i in range(1,m+1): for j in range(1,n+1): pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+mat[i-1][j-1] def find(r1,c1,r2,c2): return pre[r2+1][c2+1]-pre[r2+1][c1]-pre[r1][c2+1]+pre[r1][c1] res=float("-inf") for r1 in range(n): for r2 in range(r1,n): total=0 for c in range(n): total=max(total+find(r1,c,r2,c),find(r1,c,r2,c)) res=max(res,total) print(res)
上来先打个二维前缀和的板子
然后枚举上下边界r1r2,然后遍历纵坐标,接着就转化成一维的最大子数组和问题了