爆0求调(3关)
查看原帖
爆0求调(3关)
777131
IDNo1楼主2023/10/10 22:27

这道题目我的思路是图论,将可到达点用有向边连接 ,然后 dfs 搜索,先更新后拓展,然后样例炸了,除根节点外数组结果全部是 −2147183647-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;
}
2023/10/10 22:27
加载中...