题目链接:滑雪
这道题我一开始没想到怎么做,以为要先找到最低点(我一开始认为从最低点出发的路程最长,后来发现不是这样子的),导致无法解题。
后来在b站看了一个up主的解题思路,才明白了:要依次遍历每个点,从每个点出发计算它的最优解,每个点又有四个方向,在dfs函数中递归调用函数。
这种类型的题俗称–记忆化搜索。
#include<iostream>
using namespace std;
#define MAXN 105
int map[MAXN][MAXN],flag[MAXN][MAXN];
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
int m,n;
int dfs(int x,int y)
{
if(flag[x][y]) return flag[x][y];
flag[x][y]=1;
int xx,yy;
for(int i=0;i<4;i++){
xx=x+dx[i];
yy=y+dy[i];
if(xx<1||yy<1||xx>m||yy>n||map[xx][yy]>=map[x][y]) continue;
flag[x][y]=max(flag[x][y],dfs(xx,yy)+1);
}
return flag[x][y];
}
int main(void)
{
int maxx=1;
cin>>m>>n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>map[i][j];
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
maxx=max(maxx,dfs(i,j));
}
}
cout<<maxx<<endl;
return 0;
}