變態走樓梯

題目描述

走樓梯:
N階樓梯,每次1~M步,不走前兩次走過的步數的約束
求走法數量?

走樓梯的變種,添加不走和前兩步同步數的走法。

public class Main3 {
    public Main3() {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        scanner.close();

        fib(n, m, -1, -1);
        System.out.println(count % (1000000007));
    }
    
    private long count = 0;
    /**
     * @param pre1 前第二步
     * @param pre2 前一步
     * */
    void fib(int n, int m, int pre1, int pre2) {
        if (n == 0) {
            count++;
            return ;
        }
        if (n < 0 ) return ;
        for (int i = 1; i <= m; i++) {
            if (i == pre1 || i == pre2) continue;
            fib(n - i, m, pre2, i);
        }
    }
    public static void main(String[] args) {
        new Main3();
    }
}

遞歸解法時間複雜度很大,但是這個複雜度不是來自於子問題,對於<int n, int m, int pre1, int pre2>這四個變量來說,幾乎沒有相同的子問題,於是使用備忘錄記錄子問題的方式是效果不大的。

還有什麼方式能優化呢?

  • 動態規劃?
  • 統計數學規律?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章