题意:




思路:



%E8%A1%A8%E7%A4%BA%E5%BD%93%E5%89%8D%E5%89%A9%E4%B8%8B%E7%9A%84%E7%90%83%E4%B8%BA%5Bi%2Cj%5D%E8%83%BD%E5%8F%96%E5%BE%97%E7%9A%84%E6%9C%80%E9%AB%98%E5%BE%97%E5%88%86&preview=true)
%20%3D%20max(%20%5C%20f(i%20-%201%2Cj)%20%2B%202%5E%7B(m%20-%20j%20%2B%20i%20-%201)%7D%20%5Ccdot%20val%5Bi%20-%201%5D%EF%BC%8Cf(i%2Cj%20%2B%201)%20%2B%202%5E%7B(m%20-%20j%20%2B%20i%20-%201)%7D%20%5Ccdot%20val%5Bj%20%2B%201%5D%20%5C%20)%3B&preview=true)

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int M = 1005;
const int N = 85;
__int128 read(){
__int128 x=0,f=1;
char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1;
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return f*x;
}
void print(__int128 x){
if(x<0)putchar('-'),x=-x;
if(x>9)print(x/10);
putchar(x%10+'0');
}
int n,m;
__int128 f[M][M],g[M],a[M];
void init(){
g[0] = 1;
for(int i = 1;i <= m;i++){
g[i] = g[i - 1] * 2;
}
}
int main(){
scanf("%d%d",&n,&m);
init();
__int128 ans = 0;
for(int i = 1;i <= n;i++){
memset(f,0,sizeof(f));
for(int j = 1;j <= m;j++){
a[j] = read();
}
for(int len = m;len >= 1;len--){
for(int i = 1;i+len-1 <= m;i++){
int j = i + len - 1;
f[i][j] = max(f[i][j], f[i - 1][j] + g[m - j + i - 1] * a[i - 1]);
f[i][j] = max(f[i][j], f[i][j + 1] + g[m - j + i - 1] * a[j + 1]);
}
}
__int128 mx = 0;
for(int i = 1;i <= m;i++){
mx = max(mx,f[i][i] + g[m] * a[i]);
}
ans = ans + mx;
}
print(ans);
return 0;
}