圆环回原点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点的方案数,则递推式为:
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]