算法1
(暴力DFS)
反正会MLE…
算法2
(记忆化)
记忆化搜索,用$f_{xy}$表示在$(x,y)$是的最大步数。
C++ 代码
#include<bits/stdc++.h>
using namespace std;
#define fs(i,x,y,z) for(int i=x;i<=y;i+=z)
const int z=310,rw[]={1,-1,0,0},cl[]={0,0,1,-1};
int r,c,a[z][z],f[z][z],ans;
int dfs(int x,int y){
if(f[x][y]) return f[x][y];
fs(i,0,3,1){
int dx=x+cl[i],dy=y+rw[i];
if(dx>=0&&dx<c&&dy>=0&&dy<r&&a[dx][dy]<a[x][y]){//如果之前没搜到
f[x][y]=max(f[x][y],dfs(dx,dy)+1);//继续干下去
}
}
return f[x][y];
}
int main(){
cin>>r>>c;
fs(i,0,r-1,1){
fs(j,0,c-1,1){
cin>>a[i][j];
}
}
fs(i,0,r-1,1){
fs(j,0,c-1,1){
int l=dfs(i,j);
ans=max(ans,l);
}
}
cout<<ans+1;
return 0;
}