问题描述:
一次只能爬1阶或者2阶,那么请问有n阶楼梯会有多少种爬楼梯的方法
/*
爬楼梯
3=1+1+1=1+2=2+1 3种 1+2=a+b=sum
4=1+1+1+1=1+1+2=2+1+1=1+2+1=2+2 5种 1+3+1=3+2=b+a=sum3+b3 b3=2
5=1+1+1+1+1=1+1+1+2=1+1+2+1=1+2+1+1=2+1+1+1=2+1+2=2+2+1=1+2+2 8种 1+4+3=5+3=b+a=sum4+b4 b4=3
6=1+1+1+1+1+1=。。。。 13种 1+5+6+1=8+5=sum5+b5
*/
解决方案:
代码一:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<malloc.h>
//动态规划
/*
爬楼梯
3=1+1+1=1+2=2+1 3种 1+2=a+b=sum
4=1+1+1+1=1+1+2=2+1+1=1+2+1=2+2 5种 1+3+1=3+2=b+a=sum3+b3 b3=2
5=1+1+1+1+1=1+1+1+2=1+1+2+1=1+2+1+1=2+1+1+1=2+1+2=2+2+1=1+2+2 8种 1+4+3=5+3=b+a=sum4+b4 b4=3
6=1+1+1+1+1+1=。。。。 13种 1+5+6+1=8+5=sum5+b5
*/
int climbStairs(int n) {
if (n == 1)
{
return 1;
}
if (n == 2)
{
return 2;
}
int a = 1;
int b = 2;
int sum = 0;
while (n > 2)
{
sum = a + b;
a = b;
b = sum;
n--;
}
return sum;
}
int main() {
int n = 0;
for (int i = 1; i <= 6; i++) {
n = climbStairs(i);
printf("爬%d层楼梯有%d种方法\t", i,n);
}
//int i = 1;
// while (i < 7) {
// n = climbStairs(i);
// printf("爬%d层楼梯有%d种方法\n", i, n);
// i++;
//}
return 0;
}
代码二:动态规划解决
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<malloc.h>
int climbStairs(int n) {
if (n <= 2) {
return n;
}
int* dp = (int*)malloc((n + 1) * sizeof(int));
//int* dp = (int*)malloc((static_cast<unsigned long long>(n) + 1) * sizeof(int));
//防止出现子表达式溢出问题就写上面这行代码
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
int result = dp[n];
free(dp); // 释放分配的内存
return result;
}
int main() {
int n = 0;
for (int i = 1; i <= 6; i++) {
n = climbStairs(i);
printf("爬%d层楼梯有%d种方法\t", i,n);
}
return 0;
}
运行结果: