结合dfs的记忆搜索

家住魔仙堡 提交于 2020-03-01 07:45:34

记忆搜索

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

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中要运用
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!