第一道:最大子矩阵
题目描述
求矩阵的最大子矩阵,比较大小的依据是子矩阵所有元素和的大小
import java.util.*;
// 最大子矩阵的和
// 求矩阵的最大子矩阵,比较大小的依据是子矩阵所有元素和的大小
public class Main1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[][] matrix = new int[n][m];
for(int i = 0; i < n; i ++) {
for(int j = 0; j < m; j ++) {
matrix[i][j] = sc.nextInt();
}
}
int ans = getMaxSubMatrix(matrix);
System.out.println(ans);
}
private static int getMaxSubMatrix(int[][] matrix) {
// TODO Auto-generated method stub
int n = matrix.length;
int m = matrix[0].length;
int[] indexBE = new int[4];
int[] b = new int[m]; //记录当前i~j行组成大矩阵的每一列的和,将二维转化为一维
int sum = 0; //相当于dp[i],dp_i
int maxSum = Integer.MIN_VALUE; //记录最大值
int rowTemp = 0;
int colTemp = 0;//暂时记录左上角,相当于begin
//以i为上边,从上而下扫描
for(int i = 0; i < n; i ++) {
// 每次更换子矩形上边,就要清空b,重新计算每列的和
for(int t = 0; t < m; t ++) {
b[t] = 0;
}
// 子矩阵的下边,从i到N-1,不断增加子矩阵的高
for(int j = i; j < n; j ++) {
//一下就相当于求一次最大子序列和
sum = 0;//从头开始求dp
for(int k = 0; k < m; k ++) {
b[k] += matrix[j][k];
//我们只是不断增加其高,也就是下移矩阵下边,所有这个矩阵每列的和只需要加上新加的哪一行的元素
//因为我们求dp[i]的时候只需要dp[i-1]和nums[i],所有在我们不断更新b数组时就可以求出当前位置的dp_i
if(sum > 0) {
sum += b[k];
}else {
sum = b[k];