结合dfs的记忆搜索

记忆搜索

在一些图形问题中,我们会重复用到同一个点的值,我们不需要每次都去递归出这个值是多少,我们用一个数组将这个值保存下来,实现记忆

P1434

这个题直接用dfs会有一组数组TLE,一定要用记忆搜索

#include <bits/stdc++.h>

using namespace std;
int a[105][105];//高度地图
int maxx=0;//输出的最大值
int lenth[105][105];//记录每一个点开始滑行的最远距离
int fxx[5]={0,0,0,1,-1};//方向数组
int fxy[5]={0,1,-1,0,0};//方向数组
int n,m;
int dfs(int nowi,int nowj);//深搜加记忆,返回一个int,指这个点开始滑行的最远距离
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            lenth[i][j]=dfs(i,j);//每一个点查看从此点开始的最远距离
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            maxx=maxx>lenth[i][j]?maxx:lenth[i][j];//遍历寻最大值
        }
    }
    printf("%d\n",maxx);//输出结果
    return 0;
}
int dfs(int nowi,int nowj)
{
    if(lenth[nowi][nowj])//若之前已经计算过此点,就直接返回值
        return lenth[nowi][nowj];
    lenth[nowi][nowj]=1;//赋予这个点初始值,也就是最短滑行距离
    for(int i=1;i<=4;i++)//每个方向进行测试
    {
        if(nowi+fxx[i]>=1&&nowi+fxx[i]<=n&&nowj+fxy[i]>=1&&nowj+fxy[i]<=m&&a[nowi+fxx[i]][nowj+fxy[i]]<a[nowi][nowj])
        {
            lenth[nowi][nowj]=max(lenth[nowi][nowj],dfs(nowi+fxx[i],nowj+fxy[i])+1);
        }
    }
    return lenth[nowi][nowj];//返回它的值,在max中要运用
}

发布了44 篇原创文章 · 获赞 13 · 访问量 2321

猜你喜欢

转载自blog.csdn.net/NEFU_kadia/article/details/104577373
今日推荐