LeetCode-補充題2. 圓環回原點問題


題目來源

補充題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的方案數。
因此,若設\(dp[i][j]\)為從0點出發走i步到j點的方案數,則遞推式為:

\[dp[i][j] = dp[i-1][(j+1)%len] + dp[i-1][(j-1+len)%len] \]

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));
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM