描述
首先引用一些考到本题的面经原文描述
- 0-12共13个数构成一个环,从0出发,每次走1步,走n步回到0共有多少种走法(2020.09 字节跳动-广告-后端)[1]
- 0-8组成一个圆环,从0出发,每次可以逆时针和顺时针走,走n步能回到0有多少种情况(2020.09 字节跳动-people-后端)[2]
- 0~9的环,从0出发,N步后能否走回0。(2020.07 字节跳动-电商-后端)[3]
- 圆环回原点问题 (2020.08 字节跳动-飞书-后端)[4]
圆环上有10个点,编号为0~9。从0点出发,每次可以逆时针和顺时针走一步,问走n步回到0点共有多少种走法。
输入: 2
输出: 2
解释:有2种方案。分别是0->1->0和0->9->0
题解
- 圆环上有10个点,编号为0~9。从0点出发,每次可以逆时针和顺时针走一步,问走n步回到0点共有多少种走法
- dp[i][j] 表示走i步 能走到j点的方案次数
- 自己画个dp图就出来了,其实很简单
- 递推公式:dp[i][j] = dp[i-1][j+1] + dp[i-1][j-1] 因为j可能越界,因为是一个环
- 递推公式:推公式:dp[i][j] = dp[i-1][(j+1)%10] + dp[i-1][(j-1+10)%10]
public int loopOrigin(int n){
// 10 个 点0-9,
int[][] dp = new int[n][10];
// 初始化第0行(走一步)
dp[0][1] = 1;
dp[0][9] = 1;
for (int i = 1; i < n; i++){
for(int j = 0; j < 10; j++){
dp[i][j] = dp[i-1][(j+1)%10] + dp[i-1][(j-1+10)%10];
}
}
return dp[n-1][0];
}