[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;
    }
相关推荐
小孟Java攻城狮4 小时前
leetcode-不同路径问题
算法·leetcode·职场和发展
查理零世4 小时前
算法竞赛之差分进阶——等差数列差分 python
python·算法·差分
小猿_007 小时前
C语言程序设计十大排序—插入排序
c语言·算法·排序算法
肖田变强不变秃7 小时前
C++实现矩阵Matrix类 实现基本运算
开发语言·c++·matlab·矩阵·有限元·ansys
熊文豪9 小时前
深入解析人工智能中的协同过滤算法及其在推荐系统中的应用与优化
人工智能·算法
雪靡11 小时前
正确获得Windows版本的姿势
c++·windows
siy233311 小时前
[c语言日寄]结构体的使用及其拓展
c语言·开发语言·笔记·学习·算法
可涵不会debug11 小时前
【C++】在线五子棋对战项目网页版
linux·服务器·网络·c++·git
AI+程序员在路上11 小时前
C#调用c++dll的两种方法(静态方法和动态方法)
c++·microsoft·c#
吴秋霖11 小时前
最新百应abogus纯算还原流程分析
算法·abogus