滑雪
题目链接:
https://www.luogu.com.cn/problem/P1434#submit
题目来源:
洛谷
思路:
dfs加记忆化搜索,从每个点出发比较最长距离,记忆化每次走过的地方(节省运算时间)。
#include <bits/stdc++.h>
using namespace std;
int n ,m;
int a[105][105];
int sp[10][10]= {{-1,0},{1,0},{0,-1},{0,1}};
int bk[105][105];
int dfs(int x ,int y)
{
if(bk[x][y]) return bk[x][y];//记忆化搜索
bk[x][y]=1;//赋初始值
for(int i = 0 ; i < 4 ;i++){//上下左右
int xx = x+sp[i][0];
int yy = y+sp[i][1];
if(xx<1||xx>n||yy<1||yy>m) continue;//边界条件
if(a[xx][yy]>=a[x][y]) continue;
bk[x][y] = max(dfs(x,y),dfs(xx,yy)+1);//状态转移
}
return bk[x][y];//无路可走
}
int main()
{
int s = 0;
int x, y;
cin >> n >> m;
for(int i = 1 ; i <= n ; i++)
for(int j = 1 ; j <= m ; j++)
{
cin >> a[i][j];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
s=max(s,dfs(i,j));//每个点到最后的最大值
}
}
cout << s;
return 0;
}