import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int[][] matrix = new int[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
matrix[i][j] = in.nextInt();
}
}
int[][] prefixSum = new int[N][N];
for (int c = 0; c < N; c++) {
prefixSum[0][c] = matrix[0][c];
for (int r = 1; r < N; r++) {
prefixSum[r][c] = prefixSum[r-1][c] + matrix[r][c];
}
}
int maxSum = Integer.MIN_VALUE;
for (int i = 0; i < N; i++) {
for (int j = i; j < N; j++) {
int currentMax;
int maxSub;
int sum;
if (i == 0) {
sum = prefixSum[j][0];
} else {
sum = prefixSum[j][0] - prefixSum[i-1][0];
}
currentMax = sum;
maxSub = sum;
for (int c = 1; c < N; c++) {
if (i == 0) {
sum = prefixSum[j][c];
} else {
sum = prefixSum[j][c] - prefixSum[i-1][c];
}
currentMax = Math.max(sum, currentMax + sum);
maxSub = Math.max(maxSub, currentMax);
}
if (maxSub > maxSum) {
maxSum = maxSub;
}
}
}
System.out.println(maxSum);
}
}
https://www.nowcoder.com/discuss/727521113110073344
思路:
- 输入处理:读取矩阵的维度和元素。
- 前缀和数组计算:构建每一列的前缀和数组,以便快速计算任意行区间内的列和。
- 遍历行组合:遍历所有可能的行起始和结束组合(i, j)。
- 列和计算与Kadane算法应用:对于每个行组合,计算对应的列和数组,并使用Kadane算法找到最大子数组和,从而确定当前行组合的最大子矩阵和。
- 全局最大值更新:维护一个全局最大值,不断更新以找到所有行组合中的最大子矩阵和。



京公网安备 11010502036488号