dp+高精
再强行AC高精度的题我是狗
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
int ans[310],a[85][85],f[85][85][310],pow2[83][310],n,m;
void multiplyLN(int a, int *b, int *c) {
int carry = 0;
int product;
int bLength = b[0];
memset(c,0,200);
if(a==0 || b[0]==0) return;
for (int i = 1; i <= b[0] + 10; ++i) {
c[i] = 0;
}
for (int i = 1; i <= bLength; ++i) {
product = a * b[i] + carry;
c[i] = product % 10;
carry = product / 10;
}
int index = bLength + 1;
while (carry > 0) {
c[index] = carry % 10;
carry /= 10;
index++;
}
c[0] = index - 1;
if(c[1]==0 && c[0]==1) c[0]=0;
}
void copyLN(int *a,int *b)
{
for(int i=1;i<=b[0];i++)
a[i]=b[i];
for(int i=b[0]+1;i<=a[0];i++)
a[i]=0;
a[0]=b[0];
}
void maxLN(int *a,int *b)
{
if(b[0]==0) return;
if(a[0]<b[0]) {
copyLN(a,b);
return;
}
for(int i=a[0];i>=1;i--)
if(a[i]==b[i]) continue;
else{
if(a[i]<b[i])copyLN(a,b);
return;
}
}
void plusLN(int *a,int *b)
{
if(b[0]==0) return;
for(int i=1;i<=a[0];i++)
{
if(i>b[0]) break;
a[i]+=b[i];
}
if(a[0]<b[0]){
for(int i=a[0]+1;i<=b[0];i++)
a[i]=b[i];
a[0]=b[0];
}
for(int i=1;i<=a[0];i++)
{
a[i+1]+=a[i]/10;
a[i]=a[i]%10;
}
if(a[a[0]+1]!=0) a[0]++;
if(a[1]==0 && a[0]==1) a[0]=0;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
pow2[1][0]=1;
pow2[1][1]=2;
for(int i=2;i<=80;i++)
multiplyLN(2,&pow2[i-1][0],&pow2[i][0]);
for(int k=1;k<=n;k++)
{
int maxf1[310]={0},maxf2[310]={0},maxf[310]={0};
memset(f,0,sizeof(f));
for(int i=1;i<=m+1;i++)
for(int j=m;j>=0;j--)
{
multiplyLN(a[k][i-1],&pow2[i+m-j-1][0],maxf1);
multiplyLN(a[k][j+1],&pow2[i+m-j-1][0],maxf2);
plusLN(maxf1,&f[i-1][j][0]);
plusLN(maxf2,&f[i][j+1][0]);
maxLN(&f[i][j][0],maxf1);
maxLN(&f[i][j][0],maxf2);
if(i-j==1) {
maxLN(maxf,&f[i][j][0]);
break;
}
}
plusLN(ans,maxf);
}
for(int i=ans[0];i>=1;i--)
cout<<ans[i];
if(ans[0]==0) cout<<0;
}