#include<bits/stdc++.h>
using namespace std;
const int N=81,mod=10000;
int n,m;
struct node
{
int s[22],len;
node(){
memset(s,0,sizeof(s));
len=0;
}
void print(){
printf("%d",s[len]);
for(int i=len-1;i>0;--i)
{
if(s[i]==0)
{
printf("0000");
continue;
}
for(int k=10;k*s[i]<mod;k*=10)
{
printf("0");
}
printf("%d", s[i]);
}
}
}dp[N][N][N][2],f[N],ans,qp[N];
int a[N][N];
node operator + (const node &x,const node &y)
{
node z;
z.len=max(x.len,y.len);
int t=0;
for(int i=1;i<=z.len;++i)
{
z.s[i]=x.s[i]+y.s[i]+t;
t=z.s[i]/mod;
z.s[i]%=mod;
}
if(t>0)
{
z.s[++z.len]=t;
}
return z;
}
node operator * (const node &x,const int &y)
{
node z;
z.len=x.len;
int t = 0;
for (int i=1;i<=z.len;i++) {
z.s[i]=x.s[i]*y+t;
t=z.s[i]/mod;
z.s[i]%=mod;
}
while(t>0)
{
z.s[++z.len]=t%mod,t/=mod;
}
return z;
}
node Max(const node &x,const node &y)
{
if(x.len>y.len)
{
return x;
}
else if(x.len<y.len)
{
return y;
}
for(int i=x.len;i>=1;--i)
{
if(x.s[i]>y.s[i])
{
return x;
}
else if(x.s[i]<y.s[i])
{
return y;
}
}
return x;
}
void init()
{
qp[0].s[1]=1,qp[0].len=1;
for(int i=1;i<=m+2;++i)
{
qp[i]=qp[i-1] * 2;
}
}
int main()
{
scanf("%d%d",&n,&m);
init();
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
scanf("%d",&a[i][j]);
}
}
for(int j=1;j<=m;++j)
{
for(int i=1;i<=n;++i)
{
for(int k=1;k<=j;++k)
{
if(k==j)
{
dp[j][i][k][0]=dp[j-1][i][k-1][0] + qp[j] * a[i][k];
dp[j][i][k][1]=dp[j-1][i][k-1][1] + qp[j] * a[i][m-k+1];
}
else
{
dp[j][i][k][0]=Max(dp[j-1][i][k-1][0],dp[j-1][i][j-k][1]) + qp[j] * a[i][k];
dp[j][i][k][1]=Max(dp[j-1][i][k-1][1],dp[j-1][i][j-k][0]) + qp[j] * a[i][m-k+1];
}
if(j==m)
{
f[i]=Max(f[i],dp[j][i][k][0]);
// f[i].print();
// node mm=qp[j]*a[i][k];
// qp[j].print();
}
}
}
}
for(int i=1;i<=n;++i)
{
ans=ans + f[i];
}
ans.print();
return 0;
}
为什么最后一个点老是输出167173209630412554668705068411(答案是167173209388627390745779233470)