Skiing (dfs) problem solving

Skiing problem (source Luogu)

At first glance, is the memory of the deep search + found is really the case

Original code:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>

using namespace std;

int n,m,a[105][105],flag[105][105],maxx,t; 

int dfs(int x,int y)
{
    
    		
	    if(flag[x][y]!=0)
	    return flag[x][y];
	    
        t=0;
		if(a[x][y]>a[x][y+1])
		t=max(t,dfs(x,y+1));	
		if(a[x][y]>a[x][y-1])
		t=max(t,dfs(x,y-1));	
		if(a[x][y]>a[x+1][y])
		t=max(t,dfs(x+1,y));
		if(a[x][y]>a[x-1][y])
		t=max(t,dfs(x-1,y));

		flag[x][y]=t+1;
		return flag[x][y];
}


int main()
{
    
    
	cin>>n>>m;
	for(int i=0;i<=n+1;i++)
	{
    
    
		for(int j=0;j<=m+1;j++)
		{
    
    
			a[i][j]=1000000;
			flag[i][j]=0;
		}
	}	  
	for(int i=1;i<=n;i++)
	{
    
    
		for(int j=1;j<=m;j++)
		{
    
    
			cin>>a[i][j];
		}
	}	    
	for(int i=1;i<=n;i++)
	{
    
    
		for(int j=1;j<=m;j++)
		{
    
    
				dfs(i,j);
		}
	}
	for(int i=1;i<=n;i++)
	{
    
    
		for(int j=1;j<=m;j++)
		{
    
    
			maxx=max(maxx,flag[i][j]);
		} 
	}
    cout<<maxx;

	return 0;
}

But this can only be 90 points. It is the first data every time.
After 4 days of knocking, WA finally found out his own problem [Sahua]

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>

using namespace std;

int n,m,a[105][105],flag[105][105],maxx; 

int dfs(int x,int y)
{
    
    		
	    if(flag[x][y]!=0)
	    return flag[x][y];
        flag[x][y]=1;
		if(a[x][y]>a[x][y+1])
		flag[x][y]=max(flag[x][y],dfs(x,y+1)+1);	//万一刚好相等都是1
		if(a[x][y]>a[x][y-1])
		flag[x][y]=max(flag[x][y],dfs(x,y-1)+1);	//要在判断时就+1
		if(a[x][y]>a[x+1][y])
		flag[x][y]=max(flag[x][y],dfs(x+1,y)+1);
		if(a[x][y]>a[x-1][y])
		flag[x][y]=max(flag[x][y],dfs(x-1,y)+1);

		return flag[x][y];
}


int main()
{
    
    
	cin>>n>>m;
	for(int i=0;i<=n+1;i++)
	{
    
    
		for(int j=0;j<=m+1;j++)
		{
    
    
			a[i][j]=1000000;
			flag[i][j]=0;
		}
	}	  
	for(int i=1;i<=n;i++)
	{
    
    
		for(int j=1;j<=m;j++)
		{
    
    
			cin>>a[i][j];
		}
	}	    
	for(int i=1;i<=n;i++)
	{
    
    
		for(int j=1;j<=m;j++)
		{
    
    
				dfs(i,j);
		}
	}
	for(int i=1;i<=n;i++)
	{
    
    
		for(int j=1;j<=m;j++)
		{
    
    
			maxx=max(maxx,flag[i][j]);
		} 
	}
    cout<<maxx;

	return 0;//最重要的一步
}

【Sahua~~~】

Guess you like

Origin blog.csdn.net/yyh0910/article/details/115057591