File tree 1 file changed +77
-0
lines changed
1 file changed +77
-0
lines changed Original file line number Diff line number Diff line change 7
7
8
8
*/
9
9
10
+ class Point {
11
+ int x ;
12
+ int y ;
13
+
14
+ Point (int i , int j ){
15
+ x = i ;
16
+ y = j ;
17
+ }
18
+
19
+ }
20
+
21
+ class SubMatrix {
22
+ int sum [][];
23
+
24
+ public void fillSumMatrix (int A [][]){
25
+ int n = A .length ;
26
+ int m = A [0 ].length ;
27
+
28
+ sum = new int [n ][m ];
29
+
30
+ sum [0 ][0 ] = A [0 ][0 ];
31
+
32
+ //pre-process first row
33
+ for (int j =1 ; j < m ; j ++){
34
+ sum [0 ][j ] = sum [0 ][j -1 ] + A [0 ][j ];
35
+ }
36
+
37
+ //pre-process first col
38
+ for (int i =1 ; i < n ; i ++){
39
+ sum [i ][0 ] = sum [i -1 ][0 ] + A [i ][0 ];
40
+ }
41
+
42
+ //compute rest of the sum-matrix
43
+ for (int i =1 ; i < n ; i ++){
44
+ for (int j =1 ; j < m ; j ++){
45
+ sum [i ][j ] = A [i ][j ] + sum [i -1 ][j ] + sum [i ][j -1 ] - sum [i -1 ][j -1 ];
46
+ }
47
+ }
48
+ }
49
+
50
+ public Point maxSumSubmatrix (int k ){ //returns the bottom right corner of the maximum sum submatrix
51
+ //dimensions of the required submatrix --> (k*k)
52
+
53
+ //dimensions of main matrix
54
+ int n = sum .length ;
55
+ int m = sum [0 ].length ;
56
+
57
+ int currSum = 0 ;
58
+ int maxSum = 0 ;
59
+ Point p = null ;
60
+
61
+ for (int i =k -1 ; i < n ; i ++){
62
+ for (int j =k -1 ; j < m ; j ++){
63
+
64
+ currSum = sum [i ][j ];
65
+
66
+ if (i -k >= 0 ){
67
+ result -= sum [i -k ][j ];
68
+ }
69
+ if (j -k >= 0 ){
70
+ result -= sum [i ][j -k ];
71
+ }
72
+ if (i -k >= 0 && j -k >= 0 ){
73
+ result += sum [i -k ][j -k ];
74
+ }
75
+
76
+ if (maxSum < currSum ){
77
+ maxSum = currSum ;
78
+ p = new Point (i ,j );
79
+ }
80
+ }
81
+ }
82
+ return p ;
83
+
84
+ }
85
+
86
+ }
10
87
11
88
You can’t perform that action at this time.
0 commit comments