每日一道Leetcode - 935. 骑士拨号器【动态规划】

在这里插入图片描述
要注意的是数据类型,不然会出错
这点真的没有python好啊

class Solution {
    
    
    public int knightDialer(int n) {
    
    
        // 动态规划

        // 按拨号键,除了5以外,每个数字的下一步都有2种可能的结果
        // 1: 6 8
        // 2: 7 9
        // 3: 4 8
        // 4: 3 9 
        // 5: 无
        // 6: 1 7
        // 7: 2 6
        // 8: 1 3
        // 9: 2 4
        // 0: 4 6
        
        // 状态A:1 3 7 9 (对称)
        // 状态B:2 8 (对称)
        // 状态C:4 6 (对称)
        // 状态D:0 

        // 任选A中的一个,他可能走到状态B。也有可能走到状态C
        // 任选B中的一个,他的两种走法都是走向状态A
        // 任选C中的一个,他的三种走法中,两种走向状态A,一种走向状态D
        // 选择D中的0,他的两种走法都是走向状态C

        int MOD = 1000000007;
        if(n==1) return 10;
        // 步数大于等于2的情况,设置4种不同的状态,每种状态初始都为1步,剩下n-1步
        long[] state = new long[4];
        Arrays.fill(state, 1);

        int i = 1;
        while(i<n){
    
    
            long a_A = state[1]+state[2];
            long a_B = 2*state[0];
            long a_C = 2*state[0]+state[3];
            long a_D = 2*state[2];
            state[0] = a_A%MOD;
            state[1] = a_B%MOD;
            state[2] = a_C%MOD;
            state[3] = a_D%MOD;
            i++;
        }
        long ans = 4*state[0]+2*state[1]+2*state[2]+state[3];
        ans %= 1000000007;
        return (int)ans;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_41041275/article/details/111831650
今日推荐