题目意思找一条高度从大到小的一条路径,最开始用BFS直接只有60分,看了一下题解是用记忆化搜索,学了半个月DP竟然忘了,直接DFS就可以过了
AC代码(数组要开大一点!)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int path[201][201],height[201][201],res,n,m;
int dfs(int x,int y)
{
if(path[x][y]>0) return path[x][y];//记忆化搜索体现,如果已经搜索过了就直接返回
int dx[4]={0,1,0,-1},dy[4]={-1,0,1,0};
path[x][y]=1;//本身这个点也要算
for(int i=0;i<4;i++)
{
int xx=x+dx[i],yy=y+dy[i];
if(height[xx][yy] >= height[x][y]) continue;
if(xx<1 || xx>n || yy<1 || yy>m) continue;
path[x][y]=max(path[x][y],dfs(xx,yy)+1);//当前点最长路径为四周比它小的点最小距离再加上1
}
return path[x][y];
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&height[i][j]);
res=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
res=max(res,dfs(i,j));
}
printf("%d",res);
return 0;
}