悬2关,[record] (https://www.luogu.com.cn/record/189914854)
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct BI{
int num[505],ll;
BI(){
memset(num,0,sizeof num);
ll=0;
}
void debug(){
for(int i=1;i<=ll;i++){
if(num[i]>=1000){
int p=num[i]%1000,k=num[i]/1000;
num[i]=p;
num[i+1]+=k;
if(i==ll)ll++;
}
}
}
BI(int k){
num[1]=k;ll=1;
debug();
}
BI operator+(const BI b)const{
BI res;
res.ll=max(ll,b.ll);
for(int i=1;i<=res.ll;i++)
res.num[i]=num[i]+b.num[i];
res.debug();
return res;
}
BI operator*(const int b)const{
BI res;
res.ll=ll;
for(int i=1;i<=res.ll;i++)
res.num[i]=num[i]*b;
res.debug();
return res;
}
void WoW(){
cout<<num[ll];
for(int i=ll-1;i>=1;i--){
printf("%03d",num[i]);
}
}
};
BI max(BI a,BI b){
if(a.ll!=b.ll)return a.ll<b.ll?b:a;
for(int i=a.ll;i>=1;i--)
if(a.num[i]!=b.num[i])
return a.num[i]<b.num[i]?b:a;
return a;
}
int n,m;
long long line[100][100];
BI dp[100][100],pow2[100];
BI ans;
signed main(){
cin>>n>>m;
pow2[0]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>line[i][j];
for(int i=1;i<=m;i++){
pow2[i]=pow2[i-1]*2;
}
for(int i=1;i<=n;i++){
memset(dp,0,sizeof dp);
BI afl;
for(int l=1;l<=m;l++){
for(int r=m;r>=l;r--){
dp[l][r]=max(dp[l][r],dp[l-1][r]+pow2[m-r+l-1]*line[i][l-1]);
dp[l][r]=max(dp[l][r],dp[l][r+1]+pow2[m-r+l-1]*line[i][r+1]);
}
}
for(int l=1;l<=m;l++){
afl=max(afl,dp[l][l]+pow2[m]*line[i][l]);
}
ans=ans+afl;
}
ans.WoW();
return 0;
}