解题思路
这是一个二维最大子数组和的问题,可以通过以下步骤解决:
- 对于每一对可能的行(
),我们计算这些行之间每一列的元素和
- 将二维问题转化为一维问题:把
到
行的每一列的和看作一个一维数组
- 对这个一维数组求最大子数组和(使用
算法)
- 遍历所有可能的行对,找到最大的和
代码
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int kadane(vector<int>& arr) {
int maxSoFar = arr[0], maxEndingHere = arr[0];
for(int i = 1; i < arr.size(); i++) {
maxEndingHere = max(arr[i], maxEndingHere + arr[i]);
maxSoFar = max(maxSoFar, maxEndingHere);
}
return maxSoFar;
}
int maxSubmatrixSum(vector<vector<int>>& matrix) {
int n = matrix.size();
int maxSum = INT_MIN;
// 遍历所有可能的行对
for(int i = 0; i < n; i++) {
vector<int> colSum(n, 0);
for(int j = i; j < n; j++) {
// 计算i到j行之间每列的和
for(int k = 0; k < n; k++) {
colSum[k] += matrix[j][k];
}
// 对colSum使用Kadane算法
maxSum = max(maxSum, kadane(colSum));
}
}
return maxSum;
}
int main() {
int n;
cin >> n;
vector<vector<int>> matrix(n, vector<int>(n));
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
cin >> matrix[i][j];
}
}
cout << maxSubmatrixSum(matrix) << endl;
return 0;
}
import java.util.Scanner;
public class Main {
public static int kadane(int[] arr) {
int maxSoFar = arr[0], maxEndingHere = arr[0];
for(int i = 1; i < arr.length; i++) {
maxEndingHere = Math.max(arr[i], maxEndingHere + arr[i]);
maxSoFar = Math.max(maxSoFar, maxEndingHere);
}
return maxSoFar;
}
public static int maxSubmatrixSum(int[][] matrix) {
int n = matrix.length;
int maxSum = Integer.MIN_VALUE;
for(int i = 0; i < n; i++) {
int[] colSum = new int[n];
for(int j = i; j < n; j++) {
for(int k = 0; k < n; k++) {
colSum[k] += matrix[j][k];
}
maxSum = Math.max(maxSum, kadane(colSum));
}
}
return maxSum;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] matrix = new int[n][n];
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
matrix[i][j] = sc.nextInt();
}
}
System.out.println(maxSubmatrixSum(matrix));
sc.close();
}
}
def kadane(arr):
max_so_far = max_ending_here = arr[0]
for x in arr[1:]:
max_ending_here = max(x, max_ending_here + x)
max_so_far = max(max_so_far, max_ending_here)
return max_so_far
def max_submatrix_sum(matrix):
n = len(matrix)
max_sum = float('-inf')
for i in range(n):
col_sum = [0] * n
for j in range(i, n):
for k in range(n):
col_sum[k] += matrix[j][k]
max_sum = max(max_sum, kadane(col_sum))
return max_sum
n = int(input())
matrix = []
for _ in range(n):
row = list(map(int, input().split()))
matrix.append(row)
print(max_submatrix_sum(matrix))
算法及复杂度
- 算法:动态规划(
算法)+ 矩阵前缀和
- 时间复杂度:
,其中
是矩阵的边长
- 空间复杂度:
,用于存储列和数组