这里需要注意,因为题目保证是从高处往低处走,所以必定
没有往回走的可能,所以可以不用标记该点有没有走过
C++ 代码
#include<bits/stdc++.h>
using namespace std;
bool flag[305][305];
int dp[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int main()
{
int n,m,sum=0;
cin>>n>>m;
vector<vector<int>>ha(n,vector<int>(m,0));
vector<vector<int>>temp(n,vector<int>(m,0));
for(int i=0;i<n;++i)
for(int j=0;j<m;++j)
cin>>ha[i][j];
auto dfs=[&](auto dfs,int i,int j){ //这里直接通过lambda自调用了
if(i>=n||j>=m||i<0||j<0) return 0;
if(temp[i][j]>0) return temp[i][j];
for(int ii=0;ii<4;++ii){
int xx=i+dp[ii][0],yy=j+dp[ii][1];
if(xx>=0&&yy>=0&&xx<n&&yy<m&&ha[i][j]>ha[xx][yy])
temp[i][j]=max(temp[i][j],dfs(dfs,xx,yy)+1);
}
return temp[i][j];
};
for(int i=0;i<n;++i)
for(int j=0;j<m;++j)
sum=max(sum,dfs(dfs,i,j));
cout<<sum+1;
return 0;
}