变态走楼梯

题目描述

走楼梯:
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>这四个变量来说,几乎没有相同的子问题,于是使用备忘录记录子问题的方式是效果不大的。

还有什么方式能优化呢?

  • 动态规划?
  • 统计数学规律?
原文地址:https://www.cnblogs.com/XT-xutao/p/13611129.html