576. Out of Boundary Paths

在这里插入图片描述

这道题目需要定义三维dp:
dp[i][j][k]:第i步走到[j,k]位置共有多少种方法。

class Solution {
public:
    int findPaths(int m, int n, int N, int i, int j) {
        vector<vector<vector<int>>> dp(N+1, vector<vector<int>>(m, vector<int>(n, 0)));
        dp[0][i][j] = 1;
        int mod = 1e9+7;
        int retCnt = 0;
        vector<vector<int>> dirs{{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
        for (int i = 0; i < N; ++i) {
            for (int j = 0; j < m; ++j)
                for (int k = 0; k < n; ++k) {
                    for (auto& dir : dirs) {
                        if (j+dir[0]<0 || j+dir[0]>=m || k+dir[1]<0 || k+dir[1]>=n) {
                            retCnt = (retCnt + dp[i][j][k]) % mod;
                        } else
                            dp[i+1][j+dir[0]][k+dir[1]] = (dp[i+1][j+dir[0]][k+dir[1]]+dp[i][j][k])%mod;
                    }
                }
        }
        return retCnt;
    }
};

因为每次只从上一层推导过来,所以可以优化到只需要两个二维数组就可以了。

posted @ 2019-09-21 16:11  于老师的父亲王老爷子  阅读(21)  评论(0)    收藏  举报