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;
}
}
}
应该就可以了(逃~)