嗯嗯,解决了最大全1子矩阵的问题,就可以做codejam africa and arabia 2011的qualification round question C了。哈哈哈
翠花,上代码~
'''
CodeJam Practice
Created on 2013-01-29
@author: festony
'''
from cj_lib import *
from properties import *
import math
curr_file_name = 'C-large-practice'
#curr_file_name = 'C-small-practice'
#curr_file_name = 'test'
# So it's basically a max area all-1(all-0) sub matrix problama.
def input_dividing_func(input_lines):
total_case = int(input_lines.pop(0))
case_inputs = []
# so 1 means can be used - Grass or Shrub
def translate(description):
if description == 'G' or description == 'S':
return 1
return 0
#print map(translate, ['G', 'G', 'G', 'G', 'G', 'G', 'G'])
for i in range(total_case):
W, H = map(int, input_lines.pop(0).split(' '))
matrix = []
for j in range(H):
matrix.append(map(translate, input_lines.pop(0)))
case_inputs.append([W, H, matrix])
return case_inputs
def process_row(row):
processed_row = []
accu = 0
for i in range(len(row)):
if row[i] == 0:
processed_row.append(0)
accu = 0
else:
accu += row[i]
processed_row.append(accu)
return processed_row
def get_max_sub_for_single_col(p_m, column_num):
h = len(p_m)
row_sum = p_m[0][column_num]
max_sum = row_sum
max_row_num = [0]*h
for i in range(h):
if p_m[i][column_num] == 0:
# pass
continue
else:
if max_row_num[i] > 0:
# pass: previously examined same value
continue
max_row_num[i] = 1
same_value_rows = []
# can merge these 2 loops into 1
# but for now leave it be.
for j in range(i-1, -1, -1):
if p_m[j][column_num] < p_m[i][column_num]:
break;
else:
max_row_num[i] += 1
if p_m[j][column_num] == p_m[i][column_num]:
same_value_rows.append(j)
for j in range(i+1, h):
if p_m[j][column_num] < p_m[i][column_num]:
break;
else:
max_row_num[i] += 1
if p_m[j][column_num] == p_m[i][column_num]:
same_value_rows.append(j)
for j in same_value_rows:
max_row_num[j] = max_row_num[i]
sum = max_row_num[i] * p_m[i][column_num]
if sum > max_sum:
max_sum = sum
return max_sum
def get_max_all_1_sub(matrix):
p_m = []
for row in matrix:
p_m.append(process_row(row))
max_sum = get_max_sub_for_single_col(p_m, 0)
for i in range(1, len(matrix[0])):
sum = get_max_sub_for_single_col(p_m, i)
if sum > max_sum:
max_sum = sum
return max_sum
def process_func(func_input):
W, H, matrix = func_input
return get_max_all_1_sub(matrix)
run_proc(process_func, input_dividing_func, curr_working_folder, curr_file_name)