爬楼梯问题:
假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?
已知条件分析:
- n = 1; [1]=>1种
- n = 2; [1,1] [2]=>2种
- n = 3; [1,1,1] [1,2] [2,1]=>3种
- n = 4; [1,1,1,1] [1,2,1] [1,1,2] [2,1,1] [2,2]=>5种
- n = 5; [1,1,1,1,1] [2,1,1,1] [1,2,1,1] [1,1,2,1] [1,1,1,2] [1,2,2] [2,1,2] [2,2,1]=>8种
- ......
求的是斐波那契数列的和=》1 + 2 + 3 + 5 + 8 + 13 + .... + n
递归方式
int recursiveFbi(int n) {
if (n == 1 || n == 2) {
return n;
} else {
return recursiveFbi(n - 1) + recursiveFbi(n - 2);
}
}
动态规划
int Fbi(int n) {
int *a = (int*)malloc(sizeof(int) * n);
a[0] = 1;
a[1] = 2;
for (int i = 2; i < n; i++) {
a[i] = a[i-1] + a[i-2];
}
int ret = a[n-1];
free(a);
return ret;
}
当我动态规划写完,发现空间还可以再优化一下
动态规划-空间优化
int Fbi2(int n) {
int a1 = 1;
int a2 = 2;
int a3 = 0;
for (int i = 2; i < n; i++) {
a3 = a2 + a1;
a1 = a2;
a2 = a3;
}
int ret = a3;
return ret;
}
运行
int main(int argc, const char * argv[]) {
// insert code here...
printf("Hello, Fbi!\n");
int n = 10;
printf("递归:%d层楼梯有%d种方法\n", n , recursiveFbi(n));
printf("动态规划:%d层楼梯有%d种方法\n", n , Fbi(n));
printf("动态规划-空间优化:%d层楼梯有%d种方法\n", n , Fbi2(n));
return 0;
}