dp专题14 爬楼梯(进阶)

本文介绍了如何使用动态规划解决完全背包问题中的排列数选取问题,通过定义dp数组并进行两层循环计算,得出上n个台阶的不同方法总数。
摘要由CSDN通过智能技术生成

本题链接:题目页面

题目:

输入
3 2
输出
3

思路:

        这是个 完全背包 + 排列数选取方法的dp问题。需要注意的是初始化 0 和 1 都为 1.

代码详解如下:

#include <iostream>
#include <vector>
#define endl '\n'
#define int long long
#define IOS ios::sync_with_stdio(false),cin.tie(0)
using namespace std;

inline void solve()
{
        int n,m;
        cin >> n >> m;

        vector<int>dp(n + 1,0); // 定义 dp 数组

        // 初始化 dp ,  第 0 个台阶 和 第 1 个台阶 有 1 中方法
        dp[0] = 1;
        dp[1] = 1;

        // 假设  上 3 个台阶  ,   先 1 后 2  和 先 2 后 1 是两种不同的方法
        // 所以这是个排列数, 所以我们应该先遍历 背包,再遍历物品
        for(int i = 2;i <= n;++i)  // 这里 i 先从 2 开始 是因为我们前面初始化 过 0 和 1 了
        {
                for(int j = 1;j <= m;++j)       // 这里 j 从 1 开始 是没必要 选择 0 阶台阶的选法 
                {
                        if(i >= j) dp[i] += dp[i - j];
                }
        }

        cout << dp[n] << endl;
}

signed main()
{
        IOS;
        int t = 1;
        // cin >> t;    
        while(t--)
        {
                solve();
        }
        return 0;
}

最后提交:

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值