LeetCode-补充题2. 圆环回原点问题
题目来源
题目详情
圆环上有10个点,编号为0~9。从0点出发,每次可以逆时针和顺时针走一步,问走n步回到0点共有多少种走法。
输入: 2
输出: 2
解释:有2种方案。分别是0->1->0和0->9->0
题解分析
解法一:动态规划
本题考察的是动态规划。
如果你之前做过leetcode的70题爬楼梯,则应该比较容易理解:走n步到0的方案数=走n-1步到1的方案数+走n-1步到9的方案数。
因此,若设为从0点出发走i步到j点的方案数,则递推式为:
ps:公式之所以取余是因为j-1或j+1可能会超过圆环0~9的范围
package com.walegarrett.programming;
import org.junit.Test;
/**
* @Author WaleGarrett
* @Date 2022/4/6 16:16
*/
public class Addition_2 {
/**
* 圆环上有10个点,编号为0~9。从0点出发,每次可以逆时针和顺时针走一步,问走n步回到0点共有多少种走法。
* 输入: 2
* 输出: 2
* 解释:有2种方案。分别是0->1->0和0->9->0
*/
public int circleSteps(int n, int k){
// 圆环中有n个节点,走k步回答原点有几种走法
// 走k步走到0的走法=走k-1步走到1的走法 + 走k-1步走到num-1的走法
// dp[i][j]表示走i步走到j点的走法种类
// dp[i][j] = dp[i-1][(j+1)%len] + dp[i-1][(j-1+len)%len]
int[][] dp = new int[k+1][n];
dp[0][0] = 1;
for(int i=1; i<=k; i++){
for(int j = 0; j<n; j++){
dp[i][j] = dp[i-1][(j+1)%n] + dp[i-1][(j-1+n)%n];
}
}
return dp[k][0];
}
@Test
public void testCircleSteps(){
System.out.println(circleSteps(10, 2));
}
}
Either Excellent or Rusty
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了