[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 分钟前
bug20260415
c++·bug
luoganttcc8 分钟前
CUDA grid/block 到矩阵映射示例(矩阵加法)
人工智能·算法·机器学习
YuanDaima204813 分钟前
Python 数据结构与语法速查笔记
开发语言·数据结构·人工智能·python·算法
m0_7167652325 分钟前
数据结构--循环链表、双向链表的插入、删除、查找详解
开发语言·数据结构·c++·学习·链表·青少年编程·visual studio
XY_墨莲伊26 分钟前
【编译原理】实验一:基于正则文法的词法分析器设计与实现
开发语言·数据结构·算法
剑挑星河月30 分钟前
394.字符串解码
数据结构·算法·leetcode
算法鑫探31 分钟前
C语言实现 简易计算器教程
c语言·数据结构·算法·新人首发
得物技术1 小时前
生成式召回在得物的落地技术分享与思考
算法·性能优化·程序员
不想写代码的星星1 小时前
类型萃取:重生之我在幼儿园修炼类型学
开发语言·c++
郝学胜-神的一滴1 小时前
中级OpenGL教程 001:从Main函数到相机操控的完整实现
c++·程序人生·unity·图形渲染·unreal engine·opengl