也是从这里开始更会写高精度运算了。
贪心算法和dp很简单,只是加上了高精度而已。
#include <iostream>
#include <algorithm>
#include <cstring>
#define mem(_x) memset(_x,0,sizeof(_x))
#define fs(_x,_y) for(int _x=1;i<=_y;_x++)
#define fb(_x,_y) for(int _x=_y;_x;_x--)
using namespace std;
int a[81][100],s[100],tmp[3][100],f[81][81][100];
void carry(int* x){
fs(i,x[0]){
x[i+1]+=x[i]/10;x[i]%=10;
while(x[x[0]+1])x[0]++;
}
}
void evai(int i,int* x){
if(!i)x[0]=1;
while(i){
x[0]++;
x[x[0]]=i%10;
i/=10;
}
}
void highplus(int* x,int* y,int* z){
z[0]=max(x[0],y[0]);
fs(i,z[0])z[i]=x[i]+y[i];
carry(z);
}
bool highmax(int* x,int* y){
if(x[0]!=y[0])return x[0]>y[0];
else fb(i,x[0]){
if(x[i]>y[i])return 1;
else if(x[i]<y[i])return 0;
}
return false;
}
void higheva(int* x,int* y){
fs(i,x[0])y[i]=x[i];
y[0]=x[0];
}
void times(int* x){
fs(i,x[0])x[i]<<=1;
carry(x);
}
int main(void){
int x,n,m,g,bg,j;
cin>>n>>m;
fs(i,n){
for(j=1;j<=m;j++){cin>>x;evai(x,a[j]);evai(x<<1,f[j][j]);}
for(j=1;j<=m;j++)for(int k=1;(g=k+j)<=m;k++){
highplus(f[k+1][g],a[k],tmp[1]);highplus(f[k][g-1],a[g],tmp[2]);
times(tmp[bg=(highmax(tmp[1],tmp[2])?1:2)]);
if(highmax(tmp[bg],f[k][g]))higheva(tmp[bg],f[k][g]);
mem(tmp);
}
highplus(f[1][m],s,s);
mem(f);mem(a);
}
fb(i,s[0])cout<<s[i];
return 0;
}