【蓝桥杯】求子矩阵的最大累计和

给定一个矩阵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 }

 

posted on 2020-07-29 18:55  丁不煮  阅读(275)  评论(0)    收藏  举报

导航