蒟蒻自认为这个思路没问题,而且用这个思路应该是可以过样例的,但写出来的就是错,帮帮蒟蒻吧/kk
#include<cstdio>
#include<cstring>
int a[1010][1010];
int score[1010][1010][4];
bool vis[1010][1010];
const int dx[4]={1,-1,-1,1},dy[4]={1,1,-1,-1};
int n;
int dfs(int x,int y,int d) {
if(vis[x][y])
return 0;
if(~score[x][y][d])
return score[x][y][d];
if((x==1||x==n)&&(y==1||y==n)&&(x+dx[d]<1||x+dx[d]>n||y+dy[d]<1||y+dy[d]>n))
return a[x][y];
if((x==1||x==n)||(y==1||y==n)&&(x+dx[d]<1||x+dx[d]>n||y+dy[d]<1||y+dy[d]>n))
d=(d==3?0:d+1);
vis[x][y]=true;
int ans=a[x][y]+dfs(x+dx[d],y+dy[d],d);
vis[x][y]=false;
return score[x][y][d]=ans;
}
void _dfs(int x,int y,int d) {
if(vis[x][y])
return ;
a[x][y]=0;
if((x==1||x==n)&&(y==1||y==n)&&(x+dx[d]<1||x+dx[d]>n||y+dy[d]<1||y+dy[d]>n))
return ;
if(((x==1||x==n)||(y==1||y==n))&&(x+dx[d]<1||x+dx[d]>n||y+dy[d]<1||y+dy[d]>n))
d=(d==3?0:d+1);
vis[x][y]=true;
_dfs(x+dx[d],y+dy[d],d);
vis[x][y]=false;
}
int query() {
std::memset(score,-1,sizeof(score));
int x,y,d,s=-1,_s,ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=0;k<4;k++) {
_s=dfs(i,j,k);
if(_s>s) {
s=_s;
x=i;
y=j;
d=k;
}
}
// std::printf("%d %d %d %d\n",x,y,d,s);
ans=s;
_dfs(x,y,d);
std::memset(score,-1,sizeof(score));
s=-1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=0;k<4;k++) {
_s=dfs(i,j,k);
if(_s>s) {
s=_s;
x=i;
y=j;
d=k;
}
}
// std::printf("%d %d %d %d\n",x,y,d,s);
ans+=s;
return ans;
}
int main() {
std::scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
std::scanf("%d",&a[i][j]);
std::printf("%d",query());
return 0;
}