解题思路:

  • 行之间是独立的,取数时可以单行考虑,令dpl,rdp_{l,r}表示当前行从左取的个数和从右取的个数所得到的得分值。则dpl,r from dpl1,r or dpl,r1dp_{l,r} \ from \ dp_{l-1,r} \ or \ dp_{l,r-1}取最大值即可。
  • dpl,r=max(dpl,r,dpl1,r+vl2i,dpl,r1+vr2i)dp_{l,r} = \max(dp_{l,r}, dp_{l-1,r} + v_l * 2^i, dp_{l,r-1} + v_r * 2^i)
  • 数据涉及高精度计算,这里跳过高精度直接利用python的高精度计算
n,m = map(int, input().split())
ans = 0
for i in range(n):
    lst = list(map(int, input().split()))#输入一行处理一行结果汇总
    dp = [[0] * (m+1) for j in range(m+1)]
    for ln in range(1,m+1): #枚举取数长度
        for l in range (ln+1): #枚举构成这个长度的每一种组合
            r = ln - l
            if l > 0:
                dp[l][r] = (dp[l-1][r] + lst[l-1] * 2**ln)
            if r > 0:
                dp[l][r] = max((dp[l][r-1] + lst[m-r] * 2**ln), dp[l][r])
    mx = 0
    for l in range(m+1): #取各组合最大值
        mx = max(dp[l][m-l], mx)
    ans += mx #合并答案
    ans %= 1000000007
print(ans)