dp专题14 爬楼梯(进阶)

发布时间:2024年01月18日

本题链接:题目页面

题目:

输入
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;
}

最后提交:

文章来源:https://blog.csdn.net/hacker_51/article/details/135669867
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。