这道题目我的思路是图论,将可到达点用有向边连接 ,然后 dfs 搜索,先更新后拓展,然后样例炸了,除根节点外数组结果全部是 −2147183647,有没有人知道为什么qwq
#include<bits/stdc++.h>
#define re register int
using namespace std;
inline int read()
{
re x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
{
f=-1;
}
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
const int N=1e3+5;
int n=read(),m=read(),xx,yy;
int a[N][N];
int d[N][N];
bool mp[N][N][3],vis[N][N];
int dx[3]={-1,1,0},dy[3]={0,0,1};
void dfs(re x,re y)
{
vis[x][y]=1;
for(re i=0;i<3;i++)
{
if(mp[x][y][i]&&vis[x+dx[i]][y+dy[i]])
{
d[x][y]=max(d[x+dx[i]][y+dy[i]]+a[x][y],d[x][y]);
}
}
for(re i=0;i<3;i++)
{
if(mp[x][y][i]&&vis[x+dx[i]][y+dy[i]])
{
dfs(x+dx[i],y+dy[i]);
}
}
vis[x][y]=0;
}
int main()
{
for(re i=1;i<=n;i++)
{
for(re j=1;j<=m;j++)
{
a[i][j]=read();
d[i][j]=-2147483647;
}
}
for(re i=1;i<=n;i++)
{
for(re j=1;j<=m;j++)
{
for(re k=0;k<3;k++)
{
xx=i+dx[k],yy=j+dy[k];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m)
{
mp[i][j][k]=1;
}
}
}
}
d[1][1]=a[1][1];
dfs(1,1);
// for(re i=1;i<=n;i++)
// {
// for(re j=1;j<=m;j++)
// {
// cout<<d[i][j]<<" ";
// }
// cout<<endl;
// }
cout<<d[n][m];
return 0;
}