576. 出界的路径数(DFS+记忆化搜索转dp)

576
n年没做leetcode了QAQ,结果忽然发现某人居然做的题比我多了????(嘤嘤嘤),于是在这个阳光明媚的上午,我再一次打开了leetcode
在这里插入图片描述
嘤嘤嘤,还是很佩服那些每天都能坚持做每日一题的dl 们呜呜,要是让我不做题光签到我可能都做不到QAQAQAQQAQQAQ

好了,我们来看今天的dfs

这个题你看一眼第一反应一定是dfs,直接一顿爆搜,虽然想想都超时。
(都让你mod1e9+7了,还不超时,,,)

翻了翻题解给了一个思路,当i,j,N一定时,其实步数是一样的.那好办,开一个三维数组呗(att:注意别开太大了,你想想你一维数组开到1e6还没事,三维你开100其实就有点危险了)
于是:

#include<vector>
#include<iostream>
#include <algorithm>
#include <cmath>
#include<map>
#include <queue>
#include <stack>
#include<string>
#include <string.h>
using namespace std;
//dfs+记忆化搜索
class Solution {
public:
     long mem[53][53][53];
    int nlp=1000000007;
     long dfs(int m,int n,int N,int i,int j){
        if(i<0 || i>=m){
            return 1;
        }
        if(j<0 || j>=n){
            return 1;
        }
        if(N==0){
             return 0;
         }
        if(mem[i][j][N]!=-1){
            return mem[i][j][N];
        }
        long  result=(dfs(m,n,N-1,i+1,j))%nlp+(dfs(m,n,N-1,i-1,j))%nlp+(dfs(m,n,N-1,i,j+1))%nlp+(dfs(m,n,N-1,i,j-1))%nlp;
        mem[i][j][N]=result%nlp;
        return result % nlp;
    }
    int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {//mxn=2*2 startRow startColumn是从0开始的
        memset(mem,-1,sizeof(mem));
        return (dfs(m,n,maxMove,startRow,startColumn))%nlp;

    }
};
int main(){
    Solution s;
    //memset(mem,-1,sizeof(mem));
    cout<<s.findPaths(2,2,2,0,0);
}

一开始人犯傻,把这个位置写反了
在这里插入图片描述
就是先判断N==0
其实你想想在N==0 &&出界这种其实也可以的,,,

然后看大佬一顿dp猛如虎,禁止在麻瓜面前使用魔法

dp的边界条件也是,dp[x][y][0]==1(x==0 || x==m+1 ||y==0 ||y==n+1)(这里的i,j需要提前处理一下)
然后就,

        for(int k = 1; k <= N; k++){
            for(int p = 1; p <= m; p++){
                for(int q = 1; q <= n; q++){
                    dp[p][q][k] = (dp[p - 1][q][k - 1] + dp[p + 1][q][k - 1] + dp[p][q - 1][k - 1] + dp[p][q + 1][k - 1]) % 1000000007;
                }
            }
        }

应该就可以了(逃~)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值