AcWing 901. 滑雪(记忆化搜索)

题目链接:点击这里

在这里插入图片描述
在这里插入图片描述
dfs求出从每个点出发所能到达的最远距离,然后遍历起点取最大值。

在搜索过程中,为了防止重复计算,开一个数组记录搜索结果。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
const int N = 310;
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};

int r, c;
int a[N][N], f[N][N];

int dfs(int x, int y)
{
    int &v = f[x][y];       // 使用引用,简化代码
    
    if(v)   return f[x][y];
    
    v = 1;
    for(int i = 0; i < 4; ++i)
    {
        int tx = x + dx[i], ty = y + dy[i];
        if(tx >= 1 && tx <= r && ty >= 1 && ty <= c && a[tx][ty] < a[x][y])
		{
		    v = max(v, dfs(tx, ty) + 1);
		}
    }
    
    return v;
}

int main()
{
    scanf("%d%d", &r, &c);
    for(int i = 1; i <= r; ++i)
        for(int j = 1; j <= c; ++j)
            scanf("%d", &a[i][j]);
    
    int ans = -1e9;
    for(int i = 1; i <= r; ++i)
        for(int j = 1; j <= c; ++j)
            ans = max(ans, dfs(i, j));
    
    printf("%d\n", ans);
    
    return 0;
}
发布了844 篇原创文章 · 获赞 135 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/105032444