題目描述
走樓梯:
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>這四個變量來說,幾乎沒有相同的子問題,於是使用備忘錄記錄子問題的方式是效果不大的。
還有什麼方式能優化呢?
- 動態規劃?
- 統計數學規律?