#include <bits/stdc++.h>
using namespace std;
long long a[1010][1010];
long long ans=0,ans2=0,old=0;
int n;
struct node {
int x,y;
}lu[1000100];
bool vis[1010][1010];
bool ook[1010][1010];
node old_lu[1001000];
int way_x[4]={-1,-1,1,1};//左上右上左下右下
int way_y[4]={-1,1,-1,1};
int cmp(int x,int y){
return x>y;
}
void dfs(int way,int x,int y,int sum,int pp){
//cout<<x<<" "<<y<<" "<<sum<<" "<<way_x[way]<<" "<<way_y[way]<<" "<<endl;
if(vis[x][y]) {
int oo=sum;
for(int i=1;i<=pp-1;i++){
if(ook[lu[i].x][lu[i].y]) sum-=a[lu[i].x][lu[i].y];
}
//cout<<sum<<endl;
if(oo>ans){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
ook[i][j]=vis[i][j];
}
}
// cout<<sum<<endl;
// for(int i=1;i<=n;i++){
// for(int j=1;j<=n;j++){
// cout<<ook[i][j]<<" ";
// }
// cout<<endl;
// }
// cout<<old<<" "<<pp<<endl;
// for(int i=1;i<=old;i++){
// cout<<old_lu[i].x<<" "<<old_lu[i].y<<endl;
// }
int ni_cha=0;
for(int i=1;i<=old;i++){
if(ook[old_lu[i].x][old_lu[i].y]){
ni_cha-=a[old_lu[i].x][old_lu[i].y];
}
}
//cout<<ni_cha<<endl;
ans2=ans+ni_cha;
ans=oo;
old=pp-1;
for(int i=1;i<=old;i++) old_lu[i].x=lu[i].x,old_lu[i].y=lu[i].y;
}
else if(sum>ans2){
ans2=sum;
}
return;
}
int bb=1;
while(x+way_x[way]<=n && y+way_y[way]<=n && x+way_x[way]>0 && y+way_y[way]>0){
vis[x][y]=1;
if(bb!=1) pp++;
lu[pp].x=x;
lu[pp].y=y;
x+=way_x[way];
y+=way_y[way];
if(!vis[x][y]) {
sum+=a[x][y];
}
else break;
bb++;
}
if(way==3) dfs(1,x,y,sum,pp+1);
if(way==1) dfs(0,x,y,sum,pp+1);
if(way==0) dfs(2,x,y,sum,pp+1);
if(way==2) dfs(3,x,y,sum,pp+1);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
if(n<=3){
if(n==1) cout<<a[1][1];
else if(n==2) cout<<a[1][1]+a[1][2]+a[2][1]+a[2][2];
else {
int kk[4]={0};
int xx,yy,zz;
kk[1]=a[1][1]+a[2][2]+a[3][3];
xx=kk[1];
kk[2]=a[1][3]+a[2][2]+a[3][1];
yy=kk[2];
kk[3]=a[1][2]+a[2][1]+a[2][3]+a[3][2];
sort(kk+1,kk+4,cmp);
if((kk[1]==xx && kk[2]==yy) || (kk[1]==yy && kk[2]==xx)){
if(kk[1]+kk[2]-a[2][2]>kk[1]+kk[3]) cout<<kk[1]+kk[2]-a[2][2];
else cout<<kk[1]+kk[3];
}
else cout<<kk[1]+kk[2];
}
return 0;
}
for(int i=1;i<=n-1;i++){
dfs(3,i,1,a[i][1],1);
memset(vis,0,sizeof vis);
memset(lu,0,sizeof lu);
}
dfs(1,n,1,a[n][1],1);
cout<<ans+ans2;
return 0;
}
大佬们帮忙看一下 点15和18WA