很容易想到转移方程
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;
}
};
可以用滚动数组优化,加上坐标偏移优化,这里暂略了。