滑雪(dfs)题解

滑雪题目(来源洛谷)

乍一看,就是深搜+记忆化,结果发现 真的是这样

原始代码:

#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;
}

但这样只能90分,每次都是第一个数据WA
在磕了4天以后,终于发现了自己的问题【撒花】

#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;//最重要的一步
}

【撒花~~~】

上一篇:习题:排兵布阵(DP)


下一篇:模板 - 单源最短路Dijkstra