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,然后遍历纵坐标,接着就转化成一维的最大子数组和问题了