圆环回原点问题

1,822 阅读1分钟

题目

image.png

思路:动态规划

  • n步到0的方案数 = 走n-1步到1的方案数 + 走n-1步到9的方案数
  • dp[i][j]为从0点出发走i步到j点的方案数

image.png

  • j-1+length是防止j-1=-1
  • %length防止j-1+length或者j+1超过数组大小,绕一圈

7AB4E31EEA955D5F62C279190DC6AFA1.png

代码

public int find(int n) {
    int length = 10;//
    int[][] dp = new int[n + 1][10];//注意是n+1,走2步,走1步。走0步
    dp[0][0] = 1;
    dp[1][1] = 1;
    dp[1][length - 1] = 1;//
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= 9; j++) {
            //j-1+length是防止j-1=-1
            //%length防止j-1+length或者j+1超过数组大小,绕一圈
            dp[i][j] = dp[i - 1][(j - 1 + length) % length] + dp[i - 1][(j + 1) % length];
        }
    }
    return dp[n][0];
}