1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| const int MAX=100+10; int n,m; ll a[MAX][MAX]; struct bigint{ const static int MOD=10000; int a[1000],len; bigint(){ memset(a,0,sizeof(a)); len = 1; } bigint(ll x){ memset(a,0,sizeof(a)); len = 0; do{ a[len++]=x%MOD; x/=MOD; }while(x); } bool operator < (const bigint &b) const{ if(len<b.len) return true; if(len>b.len) return false; for(int i=len-1;i>=0;i--){ if(a[i]<b.a[i]) return true; else if(a[i]>b.a[i]) return false; } return false; } bigint operator + (const bigint &b) const{ bigint res; res.len=max(len,b.len); for(int i=0;i<res.len;i++){ res.a[i]+=((i<len)?a[i]:0)+((i<b.len)?b.a[i]:0); res.a[i+1]+=res.a[i]/MOD; res.a[i]%=MOD; } if(res.a[res.len]>0) res.len++; return res; } bigint operator * (const bigint &b) const { bigint res; for(int i=0;i<len;i++){ int up=0; for(int j=0;j<b.len;j++){ int tmp=a[i]*b.a[j] + res.a[i+j]+up; res.a[i+j] = tmp % MOD; up = tmp / MOD; } if(up) res.a[i+b.len] = up; } res.len =len + b.len; while(res.a[res.len -1] == 0 && res.len >1) res.len--; return res; } void print(){ printf("%d",a[len-1]); for(int i=len-2;i>=0;i--){ printf("%04d",a[i]); } puts(""); } }; bigint f[MAX][MAX],ans,p2[MAX]; int main(){ freopen("in","r",stdin); p2[0]=bigint(1); fi(i,1,MAX) p2[i]=p2[i-1]*bigint(2); sf(n);sf(m); fi(i,0,n) fi(j,0,m) scanf("%lld",&a[i][j]); fi(i,0,n){ fi(j,0,m) f[j][j]=bigint(a[i][j])*p2[m]; fi(k,2,m+1){ fi(j,0,m-k+1){ int e = j + k - 1; bigint t1 = f[j+1][e] + bigint(a[i][j])*p2[m-k+1]; bigint t2 = f[j][e-1] + bigint(a[i][e])*p2[m-k+1]; if(t1<t2) f[j][e] = t2; else f[j][e] = t1; } } ans = ans + f[0][m-1]; } ans.print(); return 0; }
|