题目链接
题目描述
一个环上有 length 个点,编号为0-length-1,从0点出发,每步可以顺时针到下一个点,也可以逆时针到上一个点,求:经过n步又回到0点有多少种不同的走法?
如果n=1, length=10,则从0出发只能到1或者9,不可能回到0,共0种走法
如果n=2, length=10,则从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 {
public int backToOrigin(int n) {
// n 走的步数
int length = 10;// 点的个数
int[][] dp = new int[n+1][length];
dp[0][0] = 1;
// 走 i 步
for(int i = 1; i <= n; ++i){
// 到点 j
for(int j = 0; j < length; ++j){
dp[i][j] = dp[i-1][(j - 1 + length) % length] + dp[i-1][(j + 1) % length];
}
}
return dp[n][0];
}
}
- 时间复杂度 O(nm)
- 空间复杂度 O(nm)