算法与数据结构高手养成:朴素的贪心法(上)最优化策略


✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭
~✨✨

🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。

我是Srlua小谢,在这里我会分享我的知识和经验。🎥

希望在这里,我们能一起探索IT世界的奥妙,提升我们的技能。🔮

记得先点赞👍后阅读哦~ 👏👏

📘📚 所属专栏:算法与数据结构高手养成

欢迎访问我的主页:Srlua小谢 获取更多信息和资源。✨✨🌙🌙

​​

​​

目录​​​​​​​

朴素的贪心法(上)最优化策略

常见贪心法归类

何为“朴素”贪心

最优化策略:取石子

取石子(改)

最优化策略适用条件

最优化策略:分析步骤

例题:机器工厂(USACO)​

步骤1:划分阶段和决策

步骤2:验证最优子结构/无后效性

步骤2.5:修改决策

步骤2.5:重新验证最优子结构/无后效性

步骤3:最优化策略

步骤3:最优化策略(改进)​

代码:机器工厂(C++)


朴素的贪心法(上)最优化策略

常见贪心法归类

1.最优化策略——每一次都采用当前最优决策

2.构造法——通过总结和归纳找到规律,直接推导出答案

3.二分答案——通过答案反推,验证合法性从而确定最优解

何为“朴素”贪心

  • 所谓“朴素”,就是可以通过确定性的贪心步骤得出最优解

  • 有些问题很难通过确定性贪心步骤得到最优解,但可以通过在贪心时加入随机因素(不是每次都选最优策略,而是几种较好策略中随机选择一种),来得到近似最优解

  • 当随机次数足够多时,这个近似最优解就会无限逼近最优解这个方法称为随机贪心法,后续会

最优化策略:取石子

每次都选取最大~

取石子(改)

由于条件限制,不能做到每次都拿最多,如果第一次拿3,第二次拿4时,第三次就不能再拿了

不适用贪心,但动态规划可解

最优化策略适用条件

第一,有明确的阶段,且每个阶段的决策都很清晰

  • 阶段一定是按顺序执行的

  • 对于第K(1≤K≤N)个阶段,前K轮的最优决策集合称为局部最优解当K=N时,称为全局最优解

第二,一个阶段的局部最优解,一定是从前面阶段的局部最优解得到的,这个特性称之为最优子结构

  • 例:取石子里,第二轮如果取4,那么无论第三轮取什么,总数一定不是最多。只有第二轮取5(局部最优解)第三轮才有可能产生总数最多的情况

  • 反例:取石子(改)里,第二轮取5是当前最优,但第三轮取4是最优。只有第二轮不取当前最优时,第三轮才能取到最优——不适用贪心法

第三,后面阶段的决策,不会影响到前面阶段的决策,这个特性称为无后效性

  • 例:无论第二轮取哪一堆,都不影响第一轮取的石子

  • 反例:题目修改为“每种数目的石子只能取一次,比如这一次取了5个,下一次就不能再取5个”——后面选择跟前面冲突的话,就需要返回修改之前的选择

最优化策略:分析步骤

1.划分问题的阶段决策

2.验证最优子结构无后效性

3.通过比较和判断,确定每一步的最优策略

例题:机器工厂(USACO)

步骤1:划分阶段和决策

  • 阶段:周数 K(1 ≤K≤ N)

  • 决策:第 K周生产多少台机器

步骤2:验证最优子结构/无后效性

  • 无后效性:满足

  • 因为第 K 周生产几台都不影响第1~K-1周的交付(不可能后面生产的穿越回去交付前面的订单)

  • 最优子结构呢?

局部最优解定义:完成前 K周订单的总成本最小(K=N)时就是全局最优解 在这个定义下,局部最优解一定是刚好满足K周订单需求即可不会额外生产供以后交付,否则会浪费

不满足最优子结构?

步骤2.5:修改决策

  • 问题出在决策:不能只满足本周的需求而不考虑后续需要

  • 反向思考1:本周要交付的机器可以是本周生产,也可以是之前生产

  • 反向思考2:不管前面是哪周生产,成本都可以直接算出来(等于该周生产成本+储藏成本x周数差)

例:前三周每个机器生产成本分别是1,5,6,储藏成本是2

第三周要交付的机器如果在当周生产,成本是6,如果要在第二周生产,成本是5+2x1=7;如果要在第一周生产,成本是1+2x2=5

所以,第三周交付的机器,在第一周生产最省钱

步骤2.5:重新验证最优子结构/无后效性

  • 决策修改为:第K周要交付的机器应该在第几周生产

  • 无后效性仍然满足

  • 最优子结构也满足:前K周总成本最低的情况,一定是从前K-1周总成本最低的情况推出来的

步骤3:最优化策略

  • 对于第K周,计算本周交付的机器在第i(1≤i≤K)周生产并储藏到第K周,分别所需要的成本

  • 选择成本最低的一周,由它来生产第K周需要交付的订单

  • 将这个最低的成本加上前K-1周的最低总成本,得到前K周的最低总成本(局部最优解)。K=N时得到的就是最终答案

虽然问题解决了,但是这个方法的效率还有提升空间

决策时,选择某一成本最低的一周的时候,我们刚刚采用的策略是挨个计算出每一周的成本,从而选择最小的,涉及了很多重复计算,成本的变化是有一定规律的,并不需要每次都进行计算~

步骤3:最优化策略(改进)

直接把时间复杂度降低了一个数量级~时间复杂度对O(n)

代码:机器工厂(C++)

    int n, s; // 声明变量n和s,分别表示总共的星期数和保养一台机器的费用
    cin >> n >> s; // 输入总星期数和保养费用
    int p, y, min_p = INT_MAX - s; // 声明变量p、y和min_p,min_p初始化为INT_MAX-s,用来存放当前最小的生产成本
    long long total = 0; // 声明变量total用来存放总花费
    for (int i = 0 ;i < n; i++) // 循环n次,表示n个星期
    {
        cin >> p >> y; // 输入当前星期生产一台机器的成本p和订单数量y
        min_p = min(min_p + s, p); // 对当前最小成本进行更新,考虑了保养费用
        total += min_p * y; // 计算当前星期的总花费,加上当前最小成本乘以订单数量
    }
    cout << total << endl; // 输出总花费

    return 0;

​​

希望对你有帮助!加油!

若您认为本文内容有益,请不吝赐予赞同并订阅,以便持续接收有价值的信息。衷心感谢您的关注和支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/660141.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【放球问题 乘法原理 唯一分解定理】1735. 生成乘积数组的方案数

本文涉及知识点 【组合数学 隔板法 容斥原理】放球问题 乘法原理 唯一分解定理 本题同解 【唯一分解定理】【动态规划】【前缀和】1735生成乘积数组的方案数 LeetCode 1735. 生成乘积数组的方案数 给你一个二维整数数组 queries &#xff0c;其中 queries[i] [ni, ki] 。…

接口测试系列(一)-什么是接口测试

接口测试系列 为什么要做这个事情&#xff1f; 对自己过往在接口测试上的经验&#xff0c;写一个小结的系列文章&#xff0c;是一个系统性的思考和知识构建。发布的同时&#xff0c;也是希望获得更多感兴趣的同学的意见和反馈&#xff0c;可以把这个部分做的更好。 系列入口&…

Android Studio无法改变Button背景颜色解决办法

大家好&#xff0c;我是咕噜铁蛋&#xff01;今天我来和大家探讨一个在Android开发中常见但可能让初学者感到困惑的问题——如何在Android Studio中改变Button的背景颜色。这个问题看似简单&#xff0c;但实际操作中可能会遇到一些意想不到的挑战。接下来&#xff0c;我将从多个…

LLama学习记录

学习前&#xff1a; 五大问题&#xff1a; 为什么SwiGLU激活函数能够提升模型性能&#xff1f;RoPE位置编码是什么&#xff1f;怎么用的&#xff1f;还有哪些位置编码方式&#xff1f;GQA&#xff08;Grouped-Query Attention, GQA&#xff09;分组查询注意力机制是什么&…

金蝶云星空数据库迁移后,显示 error: 40 - 无法打开到 SQL Server 的连接的解决方法

原因&#xff1a;数据库迁移/或者更新IP后&#xff0c;与之前添加的数据库地址不一致导致无法连接数据库&#xff1b; 解决方法&#xff1a;修改IP为目前数据库的IP&#xff1b; 文件路径&#xff1a;在ManageSite\APP_Data\Common.config中&#xff0c;修改DbServerInstance…

Java实现对象存储的4种方式(本地对象存储、MINIO、阿里云OSS、FastDFS)

文章目录 Java实现对象存储的3中方式1、概述2、本地对象存储2.1 配置本地文件相关信息2.2 通用映射配置 ResourcesConfig2.3 文件上传业务 LocalSysFileServiceImpl2.4 上传接口2.5 演示 3、MINIO3.1 依赖3.2 配置3.3 配置连接信息3.4. MINIO文件上传业务3.5 文件上传下载接口3…

如何提高Linux RCU实时性

Linux RCU&#xff08;Read-Copy-Update&#xff09;是一种同步机制&#xff0c;用于提高多处理器系统中读取频繁且写入少的数据结构的性能。在实时系统中&#xff0c;响应时间和预测性是非常重要的。实时性意味着系统能够在严格的时间限制内完成任务。RCU通过减少锁的需求和允…

汇智知了堂实力展示:四川农业大学Python爬虫实训圆满结束

近日&#xff0c;汇智知了堂在四川农业大学举办的为期五天的校内综合项目实训活动已圆满结束。本次实训聚焦Python爬虫技术&#xff0c;旨在提升学生的编程能力和数据分析能力&#xff0c;为学生未来的职业发展打下坚实的基础。 作为一家在IT教育行业享有盛誉的机构&#xff…

Tensorflow2.0笔记 - AutoEncoder做FashionMnist数据集训练

本笔记记录自编码器做FashionMnist数据集训练&#xff0c;关于autoencoder的原理&#xff0c;请自行百度。 import os import time import tensorflow as tf from tensorflow import keras from tensorflow.keras import datasets, layers, optimizers, Sequential, metrics, …

小阿轩yx-Shell编程之正则表达式与文本处理器

小阿轩yx-Shell编程之正则表达式与文本处理器 正则表达式 &#xff08;RegularExpression&#xff0c;RE&#xff09; 正则表达式概述 正则表达式的定义 又称 正规表达式常规表达式 代码中常简写为 regex、regexp 或 RE 正则表达式 使用单个字符串来描述、匹配一系列符…

如何连接SharePoint?

知行之桥EDI系统支持连接SharePoint&#xff0c;通过在成熟的SharePoint端口&#xff08;知行之桥EDI系统中的端口是指功能模块&#xff09;的可视化界面中进行简单配置&#xff0c;即可创建连接。 创建一个SharePoint 端口 本操作指南基于知行之桥EDI系统2024版&#xff0c;…

[LitCTF 2023]yafu (中级) (素数分解)

题目&#xff1a; from Crypto.Util.number import * from secret import flagm bytes_to_long(flag) n 1 for i in range(15):n *getPrime(32) e 65537 c pow(m,e,n) print(fn {n}) print(fc {c})n 152412082177688498871800101395902107678314310182046454156816957…

k8s 全面掌控日志系统

概述 为了提高系统运维和故障排查的效率&#xff0c; 日志系统采用 ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;技术栈&#xff0c;通过 FileBeats 作为日志收集器&#xff0c;将来自不同节点的日志数据汇总并存储在 Elasticsearch 中&#xff0c;最终通过 K…

[leetcode hot150]第二百三十六题,二叉树的最近公共祖先

题目&#xff1a; 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个…

差分曼彻斯特编码详解

这是一种双向码&#xff0c;和曼彻斯特编码不同的是&#xff0c;这种码元中间的电平转换边只作为定时信号&#xff0c;不表示数据。数据的表示在于每一位开始处是否有电平转换&#xff1a;有电平转换则表示0&#xff0c;无则表示1。然后这就出现一个问题&#xff0c;很多小伙伴…

Windows系统部署YOLOv5 v6.1版本的训练与推理环境保姆级教程

文章目录 一 概述二 依赖环境(prerequisites)2.1 硬件环境2.2 软件环境 三 环境安装3.1 创建并激活虚拟环境3.2 安装Pytorch与torchvision3.3 校验Pytorch安装3.4 下载 YOLOv5 v6.1 源码3.5 安装 YOLOv5 依赖3.6 下载预训练模型3.7 安装其他依赖3.8 测试环境安装3.9 测试训练流…

一文讲清楚:如何做好建设工程项目管理?

在房地产开发中&#xff0c;作为项目负责人我目前的状况成了一个大管家&#xff0c;还要管理工程质量。上至各部门领导的关系维护&#xff0c;下到工人的吃喝拉撒都要我操心&#xff0c;还要没完没了的处理四邻纠纷和拆迁户的纠纷&#xff0c;每天都搞得很疲惫&#xff0c;如何…

第十节 SpringBoot Starter 实战之 redis 滑动窗口

使用 redis 实现滑动窗口&#xff0c;我们会基于这个场景&#xff0c;建立一个 Starter&#xff0c;在这之前&#xff0c;我们需要先。理解这个场景。 关键字&#xff1a;滑动窗口、流式计算、lua脚本、redis、zset、starter 概要&#xff1a;本文封装 redis 的API&#xff0c…

百亿数据存储-高并发搜索如何设计?

最近好多小伙伴都跑来问小北&#xff0c;百亿级别的数据存储要怎么设计架构啊&#xff1f; 听说面试里经常问到这个问题。 就像前几天&#xff0c;有位同学去字节面试&#xff0c;就碰到了这个问题&#xff1a; “百亿级数据存储&#xff0c;你怎么设计&#xff1f;” 他们回答…

Scikit-Learn随机森林回归

Scikit-Learn随机森林回归 1、随机森林1.1、集成学习1.2、Bagging方法1.3、随机森林算法1.4、随机森林的优缺点2、Scikit-Learn随机森林回归2.1、Scikit-Learn随机森林回归API2.2、随机森林回归实践(加州房价预测)1、随机森林 随机森林是一种由决策树构成的集成算法,它在大多…