Codejam Africa and Arabia 2011 qualification round question C

嗯嗯,解决了最大全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)



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值