我试了5个转移方程,感觉这个最有把握,然而还是WA
#include<bits/stdc++.h>
using namespace std;
const int Mod=10;
int n,m,in[90];
struct Num{
int x[100],len;
void inti(int a){
len=0;
while(a){
len++;
x[len]=a%Mod;
a/=Mod;
}
for(int i=len+1;i<=99;i++) x[i]=0;
}
Num friend operator + (Num a,Num b){
for(int i=1;i<=b.len;i++){
a.x[i]+=b.x[i];
a.x[i+1]+=a.x[i]/Mod;
a.x[i]%=Mod;
if(a.x[i+1]) a.len=max(a.len,i+1);
}
return a;
}
Num friend operator * (Num a,Num b){
Num c;
c.inti(0);
c.len=a.len+b.len;
for(int i=1;i<=a.len;i++){
for(int j=1;j<=b.len;j++){
c.x[i+j-1]+=a.x[i]*b.x[j];
c.x[i+j]+=c.x[i+j-1]/Mod;
c.x[i+j-1]%=Mod;
}
}
if(!c.x[c.len]) c.len--;
return c;
}
}p[100],f[100][100],a[100],er,lit,ans;
Num Max(Num a,Num b){
if(a.len>b.len) return a;
if(a.len<b.len) return b;
for(int i=a.len;i>0;i--){
if(a.x[i]>b.x[i]) return a;
if(a.x[i]<b.x[i]) return b;
}
return a;
}
void print(Num a){
for(int i=a.len;i>0;i--){
printf("%d",a.x[i]);
}
if(!a.len) printf("0");
puts("");
}
int main(){
freopen("in.txt","r",stdin);
scanf("%d%d",&n,&m);
ans.inti(0);
er.inti(2);
p[1].inti(2);
for(int i=2;i<=m;i++){//初始化1<<i
p[i].inti(0);
p[i]=p[i-1]*er;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&in[j]);
a[j].inti(in[j]);
}
for(int j=0;j<=m;j++){
for(int k=m+1;k>j;k--){
f[j][k].inti(0);
if(j!=0) f[j][k]=Max(f[j][k],p[j+m-k+1]*a[j]+f[j-1][k]);
if(k!=m+1) f[j][k]=Max(f[j][k],p[j+m-k+1]*a[k]+f[j][k+1]);
}
}
// printf("%d ",i);
// print(f[1][m+1]);
lit.inti(0);
for(int j=0;j<=m;j++){
lit=Max(lit,f[j][j+1]);
}
// print(lit);
ans=ans+lit;
}
print(ans);
}