[Algorithm][综合训练][过桥][最大差值][兑换零钱]详细讲解

目录


1.过桥

1.题目链接


2.算法原理详解 && 代码实现

  • 解法 :贪心 + BFS

    cpp 复制代码
    #include <iostream>
    #include <vector>
    using namespace std;
    
    int n = 0;
    vector<int> nums;
    
    int BFS()
    {
        int ret = 0;
        int left = 1, right = 1;
        while(left <= right)
        {
            ret++;
            
            int r = right;
            for(int i = left; i <= right; i++)
            {
                r = max(r, nums[i] + i);
                if(r >= n)
                {
                    return ret;
                }
            }
            
            left = right + 1;
            right = r;
        }
        
        return -1;
    }
    
    int main()
    {
        cin >> n;
        
        nums.resize(n + 1, 0);
        for(int i = 1; i <= n; i++)
        {
            cin >> nums[i];
        }
        
        cout << BFS() << endl;
    
        return 0;
    }

2.最大差值

1.题目链接


2.算法原理详解 && 代码实现

  • 解法 :贪心 + 模拟

    • 遍历数组的过程中,使⽤⼀个变量标记⼀下当前位置之前所有元素的最⼩值即可
    cpp 复制代码
    int getDis(vector<int>& nums, int n) 
    {
        int ret = 0, minPrev = nums[0];
        for(int i = 1; i < n; i++)
        {
            minPrev = min(nums[i], minPrev);
            ret = max(ret, nums[i] - minPrev);
        }
    
        return ret;
    }

3.兑换零钱

1.题目链接


2.算法原理详解 && 代码实现

  • 单纯积累:完全背包问题

  • 解法 :使用空间优化版本

    • 状态表示dp[i][j]:从前i个纸币中挑选,总和正好为j,此时所用的最少纸币的张数

    • 状态转移方程

    • 初始化

    • 返回值dp[n][aim]

    cpp 复制代码
    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main()
    {
        int n = 0, aim = 0;
        cin >> n >> aim;
    
        vector<int> arr(n + 1, 0);
        for(int i = 1; i <= n; i++)
        {
            cin >> arr[i];
        }
    
        vector<int> dp(aim + 1, 0x3f3f3f3f);
        dp[0] = 0;
    
        for(int i = 1; i <= n; i++)
        {
            for(int j = arr[i]; j <= aim; j++)
            {
                dp[j] = min(dp[j], dp[j - arr[i]] + 1);
            }
        }
    
        if(dp[aim] >= 0x3f3f3f3f)
        {
            cout << -1 << endl;
        }
        else
        {
            cout << dp[aim] << endl;
        }
    
        return 0;
    }
相关推荐
刘卜卜&嵌入式1 小时前
C++_设计模式_观察者模式(Observer Pattern)
c++·观察者模式·设计模式
h汉堡1 小时前
C++入门基础
开发语言·c++·学习
XINVRY-FPGA2 小时前
XCZU7EG‑L1FFVC1156I 赛灵思XilinxFPGA ZynqUltraScale+ MPSoC EG
c++·嵌入式硬件·阿里云·fpga开发·云计算·fpga·pcb工艺
Tech Synapse2 小时前
基于Surprise和Flask构建个性化电影推荐系统:从算法到全栈实现
python·算法·flask·协同过滤算法
終不似少年遊*2 小时前
国产之光DeepSeek架构理解与应用分析04
人工智能·python·深度学习·算法·大模型·ds
天天扭码2 小时前
一分钟解决 | 高频面试算法题——最大子数组之和
前端·算法·面试
杰杰批2 小时前
力扣热题100——矩阵
算法·leetcode·矩阵
明月看潮生2 小时前
青少年编程与数学 02-016 Python数据结构与算法 28课题、图像处理算法
图像处理·python·算法·青少年编程·编程与数学
_GR2 小时前
2025年蓝桥杯第十六届C&C++大学B组真题及代码
c语言·数据结构·c++·算法·贪心算法·蓝桥杯·动态规划
心想事“程”2 小时前
决策树详解+面试常见问题
算法·决策树·机器学习