当前位置:网站首页>动态规划--多步爬楼梯(爬楼梯进阶版)
动态规划--多步爬楼梯(爬楼梯进阶版)
2022-07-28 05:26:00 【步步高升b】
多步爬楼梯
题目描述1
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶,3个台阶…,直到m个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1 阶 + 1 阶
2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1 阶 + 1 阶 + 1 阶
1 阶 + 2 阶
2 阶 + 1 阶
1阶,2阶,… m阶就是物品,楼顶就是背包。
每一阶可以重复使用,例如跳了1阶,还可以继续跳1阶。
问跳到楼顶有几种方法其实就是问装满背包有几种方法。
这是一道完全背包问题
分析:
1.确定dp数组含义:爬到i个台阶的楼顶有dp[i]种方法
2.确定递推公式:求背包问题有几种方法的递推公式一般都为dp[i] += dp[i-nums[i]];
本题的递推公式为:dp[i] += dp[i-j]
3.初始化dp数组:有递推公式可以看出dp[0] = 1因为dp[0]是递推过程中一切数值的基础,如果dp[0]为0,则其他数值都是0
4.确立遍历顺序:本题是排列问题,即外层遍历背包,内层遍历物品。假如是组合问题,则外层是遍历物品,内层是遍历背包
5.举例推导dp数组
代码
#include<iostream>
#include<vector>
using namespace std;`在这里插入代码片`
class Solution{
public:
int climbStairs(int n, int m) {
vector<int> dp(n+1);
dp[0] = 1;
for (int i = 1; i <= n; i++) {
//遍历背包
for (int j = 1; j <= m; j++) {
//遍历物品
if (i-j >= 0) dp[i] += dp[i-j];
}
}
return dp[n];
}
};
int main() {
int n, m;
cin>>n>>m;
Solution Q;
cout<<Q.climbStairs(n,m);
}
边栏推荐
猜你喜欢
随机推荐
QT painting event - set background picture
Icc2 (IV) routing and postroute optimization
当前学习进度
set_ multicycle_ path
夹子套利/搬砖套利系统开发
Common table expression CTE in Clickhouse
Pycharm2019 set editor theme and default code
量化交易机器人系统开发
OpenGL快速配置方法
QT batch operation control and set signal slot
Problems of font modification and line spacing in word automatic directory
Matlab simulation of radar imaging 2 - pulse compression and windowing
Machine learning note 5 - logistic regression
Perl introductory learning (VIII) subroutine
小程序创建组件
什么气传导蓝牙耳机好、配置比较高的气传导耳机推荐
Pytorch learning notes 2 - about tensor
气导贴耳式耳机推荐、不需要佩戴入耳的气传导耳机
【学习笔记】工具
MySQL join skills





![[untitled]](/img/de/746832bfb3bb79b090215b135b8917.jpg)



