提交时间:2026-04-10 15:12:21

运行 ID: 87028

def solve(): n, m = map(int, input().split()) matrix = [] for _ in range(n): row = list(map(int, input().split())) matrix.append(row) total_score = 0 # 对每一行分别计算最大得分 for row in matrix: # dp[l][r] 表示在区间 [l,r] 中取数能获得的最大得分 dp = [[0] * m for _ in range(m)] # 按区间长度从小到大计算 for length in range(1, m + 1): for l in range(m - length + 1): r = l + length - 1 # 当前是第几次取数(从1开始) # 已经取了 (m - length) 个数,所以这是第 (m - length + 1) 次 turn = m - length + 1 power = 2 ** turn if l == r: # 只剩一个数 dp[l][r] = row[l] * power else: # 取左端点或右端点 take_left = dp[l + 1][r] + row[l] * power take_right = dp[l][r - 1] + row[r] * power dp[l][r] = max(take_left, take_right) # 这一行的最大得分是 dp[0][m-1] total_score += dp[0][m - 1] print(total_score) solve()