圆环回原点DP

2025/03/01 Offer 共 598 字,约 2 分钟

圆环回原点DP

参考

算法:一个环上有10个点,编号为0-9,从0点出发,每步可以顺时针到下一个点,也可以逆时针到上一个点,求:经过n步又回到0点有多少种不同的走法

举例:

如果n=1,则从0出发只能到1或者9,不可能回到0,共0种走法 如果n=2,则从0出发有4条路径:0->1->2, 0->1->0, 0->9->8, 0->9->0,其中有两条回到了0点,故一共有2种走法

本题考察的是动态规划。

如果你之前做过leetcode的70题爬楼梯,则应该比较容易理解:走n步到0的方案数=走n-1步到1的方案数+走n-1步到9的方案数。

因此,若设dp[i][j]为从0点出发走i步到j点的方案数,则递推式为:

Image

ps:公式之所以取余是因为j-1或j+1可能会超过圆环0~9的范围

class Solution:
    def backToOrigin(self,n):
        #点的个数为10
        length = 10
        dp = [[0 for i in range(length)] for j in range(n+1)]
        dp[0][0] = 1
        for i in range(1,n+1):
            for j in range(length):
                #dp[i][j]表示从0出发,走i步到j的方案数
                dp[i][j] = dp[i-1][(j-1+length)%length] + dp[i-1][(j+1)%length]
        return dp[n][0]

Search

    Table of Contents