记忆搜索法

Posted ych9527

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记忆搜索法相关的知识,希望对你有一定的参考价值。

出界的路径数

普通dfs搜索法

  • 传入起始位置的坐标
  • 向四个方向进行搜索,如果出界了,计数器增加
  • 但是,这种方法因为许多重复搜索,会超时
class Solution {
public:
    void _findPaths(int m,int n,int x,int y,int maxMove,int &count,int sub,int num)
    {
        if(sub>maxMove)//步伐数超过了
            return;

        if(x<0||x>=m||y<0||y>=n)//越界了
        {
            count++;
            count%=num;
            return;
        }
        
        //四个方向进行搜索
        _findPaths(m,n,x+1,y,maxMove,count,sub+1,num);
        _findPaths(m,n,x-1,y,maxMove,count,sub+1,num);
        _findPaths(m,n,x,y+1,maxMove,count,sub+1,num);
        _findPaths(m,n,x,y-1,maxMove,count,sub+1,num);

    }
    int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {
        int num=pow(10,9)+7;
        int count=0;
        _findPaths(m,n,startRow,startColumn,maxMove,count,0,num);
        return count;
    }
};

记忆搜索法

  • 将从每个位置出发,可以获得的出界数记录起来,这样在下次出现的时候,就不需要再进行搜索
  • 通过横纵坐标,以及当前的步伐数,进行定位,即给定一个三维数组进行定位
class Solution {
public:
long long _findPaths(int m,int n,int maxMove,int x,int y,int sub,vector<vector<vector<long long>>>&dp,int mod)
    {
        if(sub>maxMove)//超出步伐数
            return 0;
        if(x<0||x>=m||y<0||y>=n)//越界了
            return 1;
        if(dp[sub][x][y]!=-1)
            return dp[sub][x][y];
        
        return dp[sub][x][y]=
        (_findPaths(m,n,maxMove,x+1,y,sub+1,dp,mod)+
        _findPaths(m,n,maxMove,x-1,y,sub+1,dp,mod)+
        _findPaths(m,n,maxMove,x,y+1,sub+1,dp,mod)+
        _findPaths(m,n,maxMove,x,y-1,sub+1,dp,mod))%mod;
    }

    int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {
        int mod=pow(10,9)+7;

        //dp[k][i][j] 表示在[i,j]位置,步伐为K时的次数
        vector<vector<vector<long long>>> dp(maxMove+1,vector<vector<long long>>(m,vector<long long>(n,-1)));
        return _findPaths(m,n,maxMove,startRow,startColumn,0,dp,mod);
    }
};

以上是关于记忆搜索法的主要内容,如果未能解决你的问题,请参考以下文章

C语言——如何有效记忆冒泡排序法?

基于递归学习法以及记忆化的学习方法论

一张图帮你记忆,Spring Boot 应用在启动阶段执行代码的几种方式

英语单词记忆八法_英语单词记忆方法总结

卢菲菲最强大脑记忆训练法全套教程 01

leetcode213周赛