动态规划题目(二)——跳台阶

本文深入解析跳台阶问题的动态规划解决方案,通过递归和非递归方式实现,详细解释算法的时间复杂度,并提供对应的代码实现。同时,文章还强调了理解不同题目推算规则的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动态规划题目(二)——跳台阶

    

1. 题目描述


一个台阶总共有n 级,如果一次可以跳1 级,也可以跳2 级。

求总共有多少总跳法,并分析算法的时间复杂度。


2. 递归方式


    对于这个动态规划问题,我们一样分两步来想:


  • 假如我们跳了1级,那么剩下的跳法就是f(n-1);
  • 假如我们跳了2级,那么剩下的跳法就是f(n-2);

这个时候我们就可以递归实现了,慢!我们还需要跳出递归的条件,这个也是必不可少的!

这个题目而言,跳出递归的条件是当n==1, 2的时候,我们返回1, 2。

为什么是1,2呢?因为当n=1时,只有一种跳法;当n=2时,有两种跳法。然后有了初始值,而且只有两种情况(要么跳1级,要么跳2级),原来这就是一个斐波那契数列问题!



代码如下:


#include<iostream>
using namespace std; 

int findSolution(int N)
{
	int result[3]={0, 1, 2};   //初始情况
	
	if(N<=2)
		return result[N]; 

	return findSolution(N-1)+findSolution(N-2);   //递归实现
}

int main()
{
	int N=20; 

	int num=findSolution(N); 

	cout<<num<<endl;

	return 0; 
}




3. 非递归方式



    非递归方式也是一定要掌握的!


    如果说这是一个斐波那契数列问题的话,那么非递归方式实现也就比较容易了~


    如下:

#include<iostream>
using namespace std; 

int findSolution(int N)
{
	int Fab[3]={1,1}; 
	if(N<2)
		return 1; 

	for(int i=2; i<=N; i++)
	{
		Fab[2]=Fab[0]+Fab[1];   //这里需要注意推算规则
		Fab[0]=Fab[1]; 
		Fab[1]=Fab[2]; 
	}
	return Fab[2]; 
}

int main()
{
	int N=20; 

	int num=findSolution(N); 

	cout<<num<<endl;

	return 0; 
}



    需要指出的是,这道题目的非递归方式的推算规则比较好想,当时之前《动态规划(一)》篇中的就不是很好想,大家以后一定要注意不同题目的推算规则!


    另外,如果能够跳3级,那么实现的思路是一样的,只需要把初始的几个值替换掉就可以了~



### 蓝桥杯竞赛中的动态规划真题 #### 1. 青蛙跳台问题 在一个面试题中,有一道关于青蛙跳台的经典动态规划题目。该问题描述如下:一只青蛙一次可以上1级台阶,也可以上2级台阶。求该青蛙上一个n级的台阶总共有多少种法。 这个问题可以通过定义数组`dp[i]`表示到达第`i`级台阶的方法数来解决。递推关系为: \[ dp[i] = dp[i-1] + dp[i-2] \] 初始条件为: - `dp[0] = 1`: 台阶起点也算作一种情况。 - `dp[1] = 1`: 到达第一层台阶只有一步可走。 通过上述公式计算直到所需的层数即可得到最终的结果[^3]。 ```cpp #include <iostream> using namespace std; int main() { int n; cin >> n; // 输入楼梯高度 if (n == 0 || n == 1) { cout << 1; return 0; } long long a = 1, b = 1, c; for(int i=2;i<=n;++i){ c=a+b; a=b; b=c; } cout<<b<<endl; } ``` 此代码实现了对于给定的高度`n`,返回可能的不同跃组合数量。 #### 2. 数字三角形最大路径和问题 另一个常见的蓝桥杯动态规划问题是求数字三角形的最大路径和。在这个问题里,有一个由若干行整数组成的数字金字塔结构,要求找到一条从顶部到底部经过节点数值之和最大的路线,并输出这个最大值。 解决方案涉及自底向上构建一个新的维表,在每步迭代过程中更新当前元素的最佳累积得分直至顶端位置完成整个过程[^2]。 ```python def max_path_sum(triangle): """ 计算并返回数字三角形的最大路径和. 参数: triangle -- 表示数字三角形的列表嵌套列表 [[3], [7, 4], [2, 4, 6], [8, 5, 9, 3]] 返回: 整型变量--代表最大路径上的所有数字加起来后的最高分 """ # 自下而上处理每一层的数据 for row in range(len(triangle)-2,-1,-1): for col in range(0,row+1): triangle[row][col]+=max(triangle[row+1][col],triangle[row+1][col+1]) return triangle[0][0] ``` 这段 Python 函数接收一个多维列表作为参数,它代表着输入数据——即所谓的“数字三角形”。函数会遍历这些层次并将最优解逐步积累到更高一层去,最后得出全局最佳方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值