记忆搜索法
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);
}
};
以上是关于记忆搜索法的主要内容,如果未能解决你的问题,请参考以下文章