576. 出界的路径数
LeetCode
576. 出界的路径数
思路
暴力递归肯定是不能的,都要对1e9 + 7取模了,暴力肯定超时,但是又确确实实是递归问题,考虑优化
记忆化递归
利用re数组记录下来曾经走过的路,当下一次遍历到这个点的时候,利用以前得到的数据,直接相加,不再继续遍历
class Solution {
public:
typedef long long ll;
const int MOD = 1e9 + 7;
ll re[52][52][52];
int find(int x, int y, int dep, int n, int m) {
if(x <= 0 || x > m || y <= 0 || y > n){
return 1;
}
if(!dep) return 0;
if(re[x - 1][y][dep - 1] == -1) re[x - 1][y][dep - 1] = find(x - 1, y, dep - 1, n, m);
if(re[x + 1][y][dep - 1] == -1) re[x + 1][y][dep - 1] = find(x + 1, y, dep - 1, n, m);
if(re[x][y - 1][dep - 1] == -1) re[x][y - 1][dep - 1] = find(x, y - 1, dep - 1, n, m);
if(re[x][y + 1][dep - 1] == -1) re[x][y + 1][dep - 1] = find(x, y + 1, dep - 1, n, m);
re[x][y][dep] = (re[x - 1][y][dep - 1] + re[x + 1][y][dep - 1] + re[x][y - 1][dep - 1] + re[x][y + 1][dep - 1]) % MOD;
return re[x][y][dep];
}
int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {
memset(re, -1, sizeof re);
return find(startRow + 1, startColumn + 1, maxMove, n, m);//防止边界特判,坐标都加一
}
};