洛谷-滑雪

滑雪

题目链接:

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;
}

上一篇:Acwing 动态规划打卡


下一篇:状压dp专题