变态走楼梯
题目描述
走楼梯:
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>这四个变量来说,几乎没有相同的子问题,于是使用备忘录记录子问题的方式是效果不大的。
还有什么方式能优化呢?
- 动态规划?
- 统计数学规律?