【蓝桥杯】求子矩阵的最大累计和
给定一个矩阵matrix,其中的值有正,负,零,返回子矩阵的最大累加和,
例如matrix= {
{ -1, 5, -1 },💧
{ -1, 2, 2 }, ☔
{ -1, -1, -1 } 🌂
};
返回8.
分析:
矩阵可以差分成数组,因为前面有做过求数组最大累计和的题。那么要怎么拆分呢?
可以一行一行的来,每一行按列求和;比如说,💧该行,按列求和构成的数组sums[]={-1,5,-1}
现在就是求数组中的最大累加和,就可以调用之前写的求数组的函数,求出来的最大值可以和该矩阵的最大值相比较,如果大就更新;
然后再将sums清零。再在该行的基础上算上下一行,这两行按列求和,sums[]={-2,7,1},操作同上;然后就是求三行按列求和;
第二轮,开始行下移,到第二行,同行操作;
1 public class case6_MaxSubMatrix { 2 3 public static void main(String[] args) { 4 5 int[][] matrix = { 6 { -1, 5, -1 }, 7 { -1, 2, 2 }, 8 { -1, -1, -1 } 9 }; 10 // int [][]matrix={{-1}}; 11 int res=solve(matrix); 12 System.out.println(res); 13 14 } 15 16 private static int solve(int[][] matrix) { 17 18 int beginRow=0; 19 final int M=matrix.length; 20 final int N=matrix[0].length; 21 int []sums=new int[N]; 22 int max=matrix[0][0]; 23 while(beginRow<M){//起始行{ -1, 5, -1 }, 24 for(int row=beginRow;row<M;row++){//从起始行累加到第row行; 25 for (int col = 0; col < N; col++) {//按列求和; 26 System.out.println(sums[0]); 27 sums[col]=sums[col]+matrix[row][col]; 28 } 29 int t=case5_MaxSubArray.solve2(sums); 30 if(t>max) 31 max=t; 32 } 33 Arrays.fill(sums, 0); 34 beginRow++; 35 36 } 37 return max; 38 } 39 40 }
浙公网安备 33010602011771号