Leetcode 935. 骑士拨号器: 棋盘跳跃转移dp问题

很容易想到转移方程

typedef long long LL;
class Solution {
public:
    int knightDialer(int n) {
        // dp[i][j] 表示号码表示第j次跳道数字i的方案数
        const int mod = (int)1e9+7;
        vector<vector<LL>> dp(10,vector<LL>(n+1,1));
        for(int j=1;j<n;j++){
            dp[1][j] = (dp[6][j-1]%mod + dp[8][j-1]%mod)%mod;
            dp[2][j] = (dp[7][j-1]%mod + dp[9][j-1]%mod)%mod;
            dp[3][j] = (dp[8][j-1]%mod + dp[4][j-1]%mod)%mod;
            dp[4][j] = (dp[3][j-1]%mod + dp[9][j-1]%mod + dp[0][j-1]%mod)%mod;
            dp[5][j] = 0;
            dp[6][j] = (dp[1][j-1]%mod + dp[7][j-1]%mod + dp[0][j-1]%mod)%mod;
            dp[7][j] = (dp[2][j-1]%mod + dp[6][j-1]%mod)%mod;
            dp[8][j] = (dp[1][j-1]%mod + dp[3][j-1]%mod)%mod;
            dp[9][j] = (dp[2][j-1]%mod + dp[4][j-1]%mod)%mod;
            dp[0][j] = (dp[4][j-1]%mod + dp[6][j-1]%mod)%mod;
        }
        int res = 0;
        for(int i=0;i<=9;i++) res= (res+dp[i][n-1])%mod;
        return res;
    }
};

可以用滚动数组优化,加上坐标偏移优化,这里暂略了。

猜你喜欢

转载自blog.csdn.net/wwxy1995/article/details/108353308
今日推荐