[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;
    }
相关推荐
玖剹11 分钟前
穷举 VS 暴搜 VS 深搜 VS 回溯 VS 剪枝
c语言·c++·算法·深度优先·剪枝·深度优先遍历
李兆龙的博客13 分钟前
从一到无穷大 #57:Snowflake的剪枝方案
算法·剪枝
yolo_guo29 分钟前
opencv 学习: QA_02 什么是图像中的高频成分和低频成分
linux·c++·opencv·计算机视觉
啊我不会诶38 分钟前
01BFS学习笔记
笔记·学习·算法
Ch_ty44 分钟前
leetcode解题思路分析(一百六十八)1452 - 1458 题
算法·leetcode·哈希算法
哼?~1 小时前
算法学习--离散化
算法
AI科技星1 小时前
引力编程时代:人类文明存续与升维
数据结构·人工智能·经验分享·算法·计算机视觉
2301_803554522 小时前
socket编程
c++
热爱编程的OP2 小时前
Linux进程池与管道通信详解:从原理到实现
linux·开发语言·c++
Blossom.1186 小时前
移动端部署噩梦终结者:动态稀疏视觉Transformer的量化实战
java·人工智能·python·深度学习·算法·机器学习·transformer