应用题-数组专题-等价切分( 前缀和 )

管理员
给定一个 n x m 的整数矩阵,将其用一条水平线或垂直线切成两个非空连通子矩阵,使得两个子矩阵的元素和的差值最小,输出该最小差值。 输入描述 第一行输入两个正整数,代表 n 和 m。 接下来的 n 行,每行输出 m 个正整数。 ``` 输入示例 3 3 1 2 3 2 1 3 1 2 3 ``` 数据范围: 1 <= n, m <= 100; n 和 m 不同时为 1。 ```python def main(): import sys input = sys.stdin.read data = input().split() idx = 0 n = int( data[ idx ] ) idx += 1 m = int( data[ idx ] ) idx += 1 # 统计行的前缀和 # 统计列的前缀和 # 统计矩阵数值总和 prf_row = [ 0 for _ in range( n ) ] prf_col = [ 0 for _ in range( m ) ] matrix_sum = 0 for i in range( n ): for j in range( m ): val = int( data[ idx ] ) idx += 1 prf_row[ i ] += val prf_col[ j ] += val matrix_sum += val # 枚举分割线 ans = float( 'inf' ) horizontal = 0 for i in range( n - 1 ): horizontal += prf_row[ i ] ans = min( ans, abs( matrix_sum - horizontal - horizontal ) ) vertical = 0 for j in range( m - 1 ): vertical += prf_col[ j ] ans = min( ans, abs( matrix_sum - vertical - vertical ) ) print( ans ) if __name__ == "__main__": main() ```
评论 0

发表评论 取消回复

Shift+Enter 换行  ·  Enter 发送
还没有评论,来发表第一条吧