首页 > 试题广场 >

最大子矩阵

[编程题]最大子矩阵
  • 热度指数:378 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
已知矩阵的大小定义为矩阵中所有元素的和。
给定一个大小为N*N的矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵。 比如,如下4 * 4的矩阵
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2 的最大子矩阵是
9 2
-4 1
-1 8 这个子矩阵的大小是15。

数据范围:

示例1

输入

[[0,-2,-7,0],[9,2,-6,2],[-4,1,-4,1],[-1,8,0,-2]]

输出

15
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param matrix int整型ArrayList<ArrayList<>> 
     * @return int整型
     */
    public int getMaxMatrix (ArrayList<ArrayList<Integer>> matrix) {
        // write code here
        int lenline = matrix.get(0).size();
        int len = matrix.size();
        int[][] arr = new int[lenline][len];
        int result = Integer.MIN_VALUE;
        //转换为二维数组
        for(int i = 0;i<lenline;i++){
            for(int j = 0;j<len;j++)
               arr[i][j] = matrix.get(i).get(j); 
        }
        return getMaxNum(arr);
    }
    
    private int getMaxNum(int[][] a) {
        int res = 0;
        if (a == null || a.length == 0 || a[0].length == 0) {
            return res;
        }
        int[] temp = null;
        res = Integer.MIN_VALUE;
        int max = 0;
        for (int i = 0; i < a.length; i++) {
            temp = new int[a[0].length];
            for (int j = i; j < a.length; j++) {
                max = 0;
                for (int k = 0; k < a[0].length; k++) {
                    int te = temp[k];
                    //k列当前 从i到j行的值
                    temp[k] += a[j][k];
                    //比较0-k列与单k列值
                    max = Math.max(max + temp[k], temp[k]);
                    res = Math.max(res,max);
                    
                }
            }
        }
 
        return res;
    }

发表于 2022-08-24 22:28:34 回复(0)
#include <limits.h>
int getMaxMatrix(int** matrix, int matrixRowLen, int* matrixColLen ) {
    int max = INT_MIN;
    const int nx = matrixRowLen;
    const int ny = *matrixColLen;
    for (int i=0; i<nx; i++) { // 从第一行开始向下遍历,对 i~x-1 进行计算
        int sum[MAX_INPUT] = {0};
        for (int j=i; j<nx; j++) { // 计算sum
            int dp[ny];
            for (int k=0; k<ny; k++) {
                sum[k] += matrix[k][j];
                if (k==0) dp[0] = sum[0];
                else dp[k] = (sum[k] + dp[k-1] > sum[k])?(sum[k]+dp[k-1]):sum[k];
                if (dp[k] > max) {
                    max = dp[k];
                }
            }
        }
    }
    return max;
}
发表于 2022-07-05 20:38:30 回复(0)
import java.util.*;
public class Solution {
    public int getMaxMatrix (ArrayList<ArrayList<Integer>> matrix) {
        int lenline = matrix.get(0).size();
        int len = matrix.size();
        int[][] arr = new int[lenline][len];
        for(int i = 0;i<lenline;i++){
            for(int j = 0;j<len;j++)
               arr[i][j] = matrix.get(i).get(j); 
        }
        
        for(int i = 1;i<arr.length;i++){
            for(int j = 0;j<arr[0].length;j++){
                arr[i][j] += arr[i-1][j];
            }
        }

        int ressum = Integer.MIN_VALUE;
        for(int i = 0;i<arr.length;i++){
            for(int j = i;j<arr.length;j++){
                int[] res = new int[arr[0].length];
                for(int k = 0;k<arr[0].length;k++){
                    if(i==0)
                        res[k] = arr[j][k];
                    else
                        res[k] = arr[j][k] - arr[i-1][k];
                }
                int tempsum = maxSubsequence(res);
                ressum = Math.max(tempsum,ressum);
            }
        }
        return ressum;
    }
    
    public int maxSubsequence(int[] array){
        int res = array[0];
        int[] dp = new int[array.length];
        dp[0] = array[0];
        for(int i = 1;i<dp.length;i++){
            dp[i] = Math.max(dp[i-1]+array[i],array[i]);
            res = Math.max(res,dp[i]);
        }
        return res;
    }
}

发表于 2022-05-11 16:01:47 回复(0)