题目描述
给定一个二维整数矩阵
要在这个矩阵中 选出一个子矩阵
使得这个子矩阵内所有的数字和尽量大
我们把这个子矩阵成为“和最大子矩阵”
子矩阵的选取原则,是原矩阵中一段相互连续的矩形区域
输入描述
输入的第一行包含两个整数N,M
(1 <= N,M <= 10)
表示一个N行M列的矩阵
下面有N行 每行有M个整数
同一行中每两个数字之间有一个空格
最后一个数字后面没有空格
所有的数字得在-1000 ~ 1000之间
输出描述
输出一行,一个数字
表示选出的“和最大子矩阵”内所有数字的和
示例一
¶输入
3 4
-3 5 -1 5
2 4 -2 4
-1 3 -1 3
输出
20
java代码
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
String[] split = scanner.nextLine().split(" ");
int N = Integer.parseInt(split[0]);
int M = Integer.parseInt(split[1]);
int[][] matrix = new int[N][M];
for (int i = 0; i < N; i++) {
String[] nums = scanner.nextLine().split(" ");
for (int j = 0; j < nums.length; j++) {
matrix[i][j] = Integer.parseInt(nums[j]);
}
}
int res = solution(N, M, matrix);
System.out.println(res);
}
}
private static int solution(int n, int m, int[][] matrix) {
int res =0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
//i为 n的长度 ,j为m的长度 做全排列
int max =slove(i,j,n,m,matrix);
res=Math.max(res,max);
}
}
return res;
}
private static int slove(int a, int b, int n, int m,int[][] matrix){
int sum =0;
for (int i = 0; i <= n - a; i++) {
for (int j = 0; j <= m - b; j++) {
int sum4=0;
//根据长度得到的和值 例如2X2 的所有值比较
for (int k = 0; k < a; k++) {
for (int l = 0; l < b; l++) {
sum4 += matrix[i+k][j+l];
}
}
if(sum4>sum){
sum =sum4;
}
}
}
return sum;
}