洛谷1005
主要是想巩固一下高精度
#include<cstdio> #include<cctype> #include<algorithm> #include<cstring> using namespace std; const int N=1010; const int bit=1e6; const int M=101; int read(){ char ch=getchar();int k=0,f=1;; while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch)){k=(k<<1)+(k<<3)+ch-'0';ch=getchar();} return f*k; } //注意运算符重载的使用 struct Bigint{ int len,a[N]; inline Bigint operator *(const int &x){ Bigint t=(*this); int len=t.len; for(int i=1;i<=len;i++)t.a[i]*=x; for(int i=1;i<=len;i++){ t.a[i+1]+=t.a[i]/bit;t.a[i]%=bit; } if(t.a[len+1]>0)t.len++; return t; } inline Bigint operator +(const Bigint &x){ Bigint t=(*this); int tl=max(t.len,x.len); for(int i=1;i<=tl;i++){ t.a[i]+=x.a[i]; t.a[i+1]+=t.a[i]/bit; t.a[i]%=bit; } if(t.a[tl+1]>0)tl++;t.len=tl; return t; } inline Bigint operator =(const int &x){ len=1;a[1]=x;return *this; } inline void write(){ Bigint t=(*this); for(int i=t.len;i>0;i--){ int tmp=bit; while(i<len&&tmp>10*t.a[i]){tmp/=10;putchar(48);}//补位0 printf("%d",t.a[i]); } } }f[M][M],p[M],res; int n,m,b[M]; inline void checkmax(Bigint &a,Bigint b){ if(a.len<b.len){a=b;return;} else if(a.len!=b.len)return; for(int i=a.len;i>0;i--){ if(a.a[i]<b.a[i]){a=b;return;} else if(a.a[i]!=b.a[i])return; } } inline void dp(){ for(int i=1;i<=m;i++) for(int j=m;j>=i;j--){ f[i][j].len=0; Bigint t1=f[i-1][j]+p[m-j+i-1]*b[i-1],t2=f[i][j+1]+p[m-j+i-1]*b[j+1]; checkmax(t2,t1); checkmax(f[i][j],t2); } Bigint ans;ans=-1; for(int i=1;i<=m;i++){ Bigint t=f[i][i]+p[m]*b[i]; checkmax(ans,t); } res=res+ans; return; } int main(){ p[0]=1; for(int i=1;i<=90;i++)p[i]=p[i-1]*2; n=read();m=read(); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++) b[j]=read(); dp(); } res.write(); return 0; }