1+ n ,m = map (int ,raw_input ().strip ().split ())
2+ matrix = [map (int ,list (raw_input ().strip ())) for _ in range (n )]
3+ sum_values = [[0 ]* (m + 1 ) for i in range (n + 1 )]
4+ for i in range (1 , n + 1 ):
5+ for j in range (1 , m + 1 ):
6+ sum_values [i ][j ] += sum_values [i - 1 ][j ] + sum_values [i ][j - 1 ] - sum_values [i - 1 ][j - 1 ] + matrix [i - 1 ][j - 1 ]
7+
8+ def calculate_sum (p1 ,p2 ):
9+ x1 ,y1 = p1
10+ x2 ,y2 = p2
11+ a1 ,a2 = sum_values [x1 - 1 ][y1 - 1 ],sum_values [x1 - 1 ][y2 ]
12+ a3 ,a4 = sum_values [x2 ][y1 - 1 ],sum_values [x2 ][y2 ]
13+ value = a4 - a3 - a2 + a1
14+ return value
15+
16+ def check (mid ):
17+ for j1 in range (1 , m - 2 ):
18+ if calculate_sum ((1 ,1 ),(n ,j1 )) < mid * 4 : continue
19+ for j2 in range (j1 + 1 , m - 1 ):
20+ if calculate_sum ((1 ,j1 + 1 ),(n ,j2 )) < mid * 4 : continue
21+ for j3 in range (j2 + 1 , m ):
22+ if calculate_sum ((1 ,j2 + 1 ),(n ,j3 )) < mid * 4 : continue
23+ if calculate_sum ((1 ,j3 + 1 ),(n ,m )) < mid * 4 : continue
24+ pstart ,row_count = 1 ,0
25+ for pend in range (1 , n + 1 ):
26+ p1_list = [(pstart ,1 ),(pstart ,j1 + 1 ),(pstart ,j2 + 1 ),(pstart ,j3 + 1 )]
27+ p2_list = [(pend ,j1 ),(pend ,j2 ),(pend ,j3 ),(pend ,m )]
28+ values = [calculate_sum (p1 ,p2 ) for p1 ,p2 in zip (p1_list ,p2_list )]
29+ if min (values ) >= mid :
30+ pstart = pend + 1
31+ row_count += 1
32+ if row_count == 4 :return True
33+ return False
34+
35+ l , r = 0 , sum_values [n ][m ]
36+ answer = 0
37+ while l <= r :
38+ mid = (l + r ) / 2
39+ if check (mid ):
40+ l = mid + 1
41+ answer = mid
42+ else :
43+ r = mid - 1
44+ print (answer )
0 commit comments