0
点赞
收藏
分享

微信扫一扫

[动态规划]DP3 跳台阶扩展问题-简单

​​DP3 跳台阶扩展问题​​

描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶(n为正整数)总共有多少种跳法。

数据范围:[动态规划]DP3 跳台阶扩展问题-简单_数组
进阶:空间复杂度 [动态规划]DP3 跳台阶扩展问题-简单_动态规划_02 , 时间复杂度 [动态规划]DP3 跳台阶扩展问题-简单_动态规划_02

输入描述:

本题输入仅一行,即一个整数 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,则[动态规划]DP3 跳台阶扩展问题-简单_递归_04

代码如下:

int solve3(int n)
{
return 1 << (n-1);
}


举报

相关推荐

0 条评论