建立height[][]数组表示到该点的最长距离
从height[0][0]点开始遍历(任意点都行)
查看上下左右点符合比该点低则判断:
1.如果有点为0,则查看该点的四个邻点(利用递归),返回到达该0点的最长点。
2.如果都非0,取最长点+1。
最后找到height中最长的一点。
#include <iostream>
#include <algorithm>
#include <cstring>
#define maxn 101
using namespace std;
int height[maxn][maxn];
int map[maxn][maxn];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};int test_num,row_num,column_num;
int f(int x,int y){
int max_len=0;
for(int i=0;i<4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=0&&nx<row_num&&ny>=0&&ny<column_num&&map[nx][ny]<map[x][y]){
if(height[nx][ny]==0) height[nx][ny]=f(nx,ny);
max_len=max(max_len,height[nx][ny]);
}
}
return height[x][y]=max_len+1;
}
int main(){
cin>>test_num;
while(test_num--){
cin>>row_num>>column_num;
for(int i=0;i<row_num;i++){
for(int j=0;j<column_num;j++){
cin>>map[i][j];
height[i][j]=0;
}
}
int max_len=0;
for(int i=0;i<row_num;i++){
for(int j=0;j<column_num;j++){
if(height[i][j]==0){
max_len=max(f(i,j),max_len);
}
}
}
cout<<max_len<<endl;
}
}
本文介绍了一种求解二维数组中从任意点出发的最长下降路径的算法。通过使用递归和动态规划的方法,文章详细解释了如何计算每个点的最长路径,并最终找到整个数组中的最大值。代码示例清晰地展示了算法的实现过程。
988

被折叠的 条评论
为什么被折叠?



