DP3 跳台阶扩展问题
描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶(n为正整数)总共有多少种跳法。
数据范围:
进阶:空间复杂度 , 时间复杂度
输入描述:
本题输入仅一行,即一个整数 n
输出描述:
输出跳上 n 级台阶的跳法
示例1
输入:
3
输出:
4
示例2
输入:
1
输出:
1
题解
假设我们要爬到第n个台阶总共有f(n)种跳法。我们可以分别从1~n-1一次性的跳上来,而跳到[1,n-1]台阶分别有f(1),f(2)...f(n-1)种跳法,所以f(n) = f(n-1) + f(n-2) + ... + f(2) + f(1) + 1
解法一:递归解法
- 初始条件:f(0) = 0
- 递归条件:f(n) = f(n-1) + f(n-2) + ... + f(2) + f(1) + 1
代码如下:
int solve(int n)
{
if (n == 1)
{
return 1;
}
int x = 0;
for (int i = 1;i < n;++i)
{
x += solve(n - i);
}
return x + 1;
}
解法二:动态规划
- dp数组:dp[i]表示跳到第i+1个台阶的总方法数
- 初始条件:dp[0] = 1
- 推导条件:dp[i] = dp[i-1] + dp[i-2] + ... + dp[0] + 1
代码如下:
int solve3(int n)
{
std::vector<int> dp(n,0);
int x = 0;
for (int i = 0;i < n;++i)
{
for (int k = i-1;k >= 0;--k)
{
dp[i] = dp[i] + dp[k];
}
dp[i]+=1;
}
return dp[n-1];
}
解法三:数学公式法
根据f(n) = f(n-1) + f(n-2) + ... + f(2) + f(1) + 1,有f(n-1) = f(n-2) + ... + f(2) + f(1) + 1,两个式子相减得到f(n) = 2*f(n-1),而f(1) = 1,则
代码如下:
int solve3(int n)
{
return 1 << (n-1);
}