圆环回原点问题

圆环上有10个点,编号为0~9。从0点出发,每次可以逆时针和顺时针走一步,问走n步回到0点共有多少种走法。
输入: 2
输出: 2
解释:有2种方案。分别是0->1->0和0->9->0

走i步走到j的有n中方法 等于 {走i-1步到 j-1} + {走 i-1步到j+1}

dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1];

因为有回环,所以需要走到j-1可能为负数

dp[i][j] = dp[i-1][(j-1+length)%length] + dp[i-1][(j+1+length)%length];

public class Solution {

    private static int backToOrigin(int k) {
        int[][] dp = new int[k + 1][10];
        dp[0][0] = 1;
        for (int i = 1; i < k + 1; i++) {
            for (int j = 0; j < 10; j++) {
                dp[i][j] = dp[i - 1][(j - 1 + 10) % 10] + dp[i - 1][(j + 1) % 10];
            }
        }
        return dp[k][0];
    }

    private static int backToOrigin(int n, int k) {
        if (n == 0) {
            return 1;
        }
        if (n == 2) {
            if (k % 2 == 0) {
                return k;
            } else {
                return 0;
            }
        }
        int[][] dp = new int[k + 1][n];
        dp[0][0] = 1;
        for (int i = 1; i < k + 1; i++) {
            for (int j = 0; j < n; j++) {
                dp[i][j] = dp[i - 1][(j - 1 + n) % n] + dp[i - 1][(j + 1) % n];
            }
        }
        return dp[k][0];
    }

    public static void main(String[] args) {
        System.out.println(backToOrigin(2));
        System.out.println(backToOrigin(3));
        System.out.println(backToOrigin(4));
        System.out.println(backToOrigin(5));
        System.out.println(backToOrigin(6));
        System.out.println(backToOrigin(10, 2));
        System.out.println(backToOrigin(10, 3));
        System.out.println(backToOrigin(10, 4));
        System.out.println(backToOrigin(10, 5));
        System.out.println(backToOrigin(10, 6));

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值