假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n
是一个正整数。
//回溯算法,超出时间限制
int num = 0;
void backtrack(int n)
{
if(n == 0)
{
num++;
return;
}
if(n - 1 >= 0)
{
backtrack(n-1);
}
if(n-2 >= 0)
{
backtrack(n-2);
}
}
int climbStairs(int n){
num = 0;
backtrack(n);
return num;
}
//动态规划
int climbStairs(int n){
if(n == 1)
{
return 1;
}
if(n == 2)
{
return 2;
}
int *dp = (int*)malloc(sizeof(int) * (n+1));
dp[1] =1;
dp[2] = 2;
for(int i = 3; i <= n; i++)
{
dp[i] = dp[i-1]+dp[i-2];
}
return dp[n];
}
思路:动态规划
状态转移方程:dp[i] = dp[i-1]+dp[i-2]
第n阶只能由第n-1阶或者第n-2阶跳上来的,所以第n阶的步数为n-1 + n-2