#include<iostream> #include<cstring> #include<string> #include<cstdio> #include<algorithm> using namespace std; #define N 35 //const int N(35); #define REP(i,n) for (int i=0;i<(n);i++) struct bign { int len,s[N]; bign() { memset(s,0,sizeof(s)); len=1; } bign(int num) { *this=num; } bign(char *num) { *this=num; } bign operator =(int num) { char c[N]; sprintf(c,"%d",num); *this=c; return *this; } bign operator =(const char *num) { len=strlen(num); REP(i,len) s[i]=num[len-1-i]-'0'; return *this; } string str() { string res=""; REP(i,len) res=(char)(s[i]+'0')+res; return res; } void clean() { while (len>1&&!s[len-1]) len--; } bign operator +(const bign &b) { bign c; c.len=0; for (int i=0,g=0;g||i<len||i<b.len;i++) { int x=g; if (i<len) x+=s[i]; if (i<b.len) x+=b.s[i]; c.s[c.len++]=x%10; g=x/10; } return c; } bign operator -(const bign &b) { bign c; c.len=0; int x; for (int i=0,g=0;i<len;i++) { x=s[i]-g; if (i<b.len) x-=b.s[i]; if (x>=0) g=0; else{ x+=10; g=1; }; c.s[c.len++]=x; } c.clean(); return c; } bign operator *(const bign &b) { bign c; c.len=len+b.len; REP(i,len) REP(j,b.len) c.s[i+j]+=s[i]*b.s[j]; REP(i,c.len-1) { c.s[i+1]+=c.s[i]/10; c.s[i]%=10; } c.clean(); return c; } bool operator <(const bign &b) { if (len!=b.len) return len<b.len; for (int i=len-1;i>=0;i--) if (s[i]!=b.s[i]) return s[i]<b.s[i]; return false; } bign operator +=(const bign &b) { *this=*this+b; return *this; } bign operator -=(const bign &b) { *this=*this-b; return *this; } }; //istream& operator >>(istream &in,bign &x) //{ // string s; // in>>s; // x=s.c_str(); // return in; //} ostream& operator <<(ostream &out,bign &x) { out<<x.str(); return out; } bign p[81],f[81][81],ans(0); int n,m,a[81][81]; void init() { //ifstream cin("game.in"); //freopen("game.in","r",stdin); cin>>n>>m; //scanf("%d%d",&n,&m); REP(i,n) REP(j,m) cin>>a[i][j]; //scanf("%d",&a[i][j]); p[0]=1; REP(i,m) p[i+1]=p[i]*2; } int main() { init(); REP(t,n){ memset(f,0,sizeof(f)); for (int k=1;k<=m;k++) for (int i=0;i<=k;i++) { if (i>0) f[k][i]=f[k-1][i-1]+p[k]*a[t][i-1]; if (i<k&&f[k][i]<f[k-1][i]+p[k]*a[t][m-(k-i)]) f[k][i]=f[k-1][i]+p[k]*a[t][m-(k-i)]; } bign maxn; for (int i=0;i<=m;i++) if (maxn<f[m][i]) maxn=f[m][i]; ans+=maxn; } //ofstream cout("game.out"); cout<<ans<<endl; //system("pause"); return 0; } /************************************************************** Problem: 2274 User: admin Language: C++ Result: Accepted Time:645 ms Memory:3040 kb ****************************************************************/