贪心算法简单总结(二)(21.3.20)

本周学习了贪心算法来解决实际问题,贪心算法是按照最优策略,从局部寻找最优解。我认为贪心算法是一种简化问题的思维方式,通过分析题目,可以列出多种解决方式,寻找最优解;或者通过转化问题,从反面入手,将一种复杂的问题转化成基本类型套路;或者将一种基本问题带入现实情景,这需要我们仔细分析题目抓住关键点。一般题目中,一些关键词不可忽略,如:截止时间,交点,最多(少),不重叠,前后等等,注意题目中给的限定条件及题目信息提示比较或者方程等式等等。最近做题挺多的,对贪心的思维方式有了一定的理解,贪心题目一般需要先对数据进行排序,再根据问题对数据顺序处理,以下总结了几种贪心抽象出的套路。

性价比问题。如猫粮换豆子,背包问题,根据性价比排序,选先价值最大的,再求解。背包问题注意物品是否可分解。

.区间调度问题:有两类,一类是区间覆盖。
例如:给你n个不同区间,让你找出一个集合,每个区间至少有1个元素存在于集合内,求集合里最少的元素。需要将区间右端点排序,对第一个区间右端点标记,与下一个区间左端点位置比较,再更新指针,寻找覆盖求最优解。其他的如最近做的海岛问题,先把岛转换成区间,再求解。
另一类是区间不重叠问题。如电视台电视不同端播出,参加不同活动,同样是区间排序+设置指针,方法与区间覆盖类似,主要思想是 找结束早的,在剩下的区间里找不重叠的。
这两种类型都需要设置一个"指针",通过不断更新指针的位置来解决问题,根据这个进一步推广到指针问题,如字典序最小问题,在一串字符串里从前端或后端取一个元素,组成一个新的字符串让他字典序最小,主要思维是从原字符串的前后端设置指针,比较两个指针处字母大小,再分别向内更新指针,这个问题也可以通过求逆串按同一方向更新指针解决。

截止时间问题:主要是给你不同的价值,每个价值有不同的截止时间,求在截止时间内最大价值。这需要先按截止时间从小到大排序,价值也跟着截止时间排,这里需要用到结构体或者pair来处理,先做截止时间短的,如果有相同的截止时间,选价值大的,然后将下一个与之前价值小的替换,依次类推。或者另一种方法,按照截止时间从大到小排序,截止时间的基础上价值从大到小排序,先将价值大的在截止时间那天做,其他相同截止时间的将截止时间减一,即更换截止时间让它变短,然后在下一个截止时间里找价值最大的,实现价值最大化。

其他的还有一些找规律的贪心题目,这类问题一般不太好做,我们在分析这类问题时,注意抓住题目关键点,即寻找能指向题目每一个答案有联系的语句,比如A数组和B数组问题,给你数组A,让你找B使一个式子的和最小,这需要先分析等式,根据等式找出与B组每一个数相关联的内容,进而找出B中的每一个数。

最近做了一些贪心题目,有的题干复杂不好理解不易读懂,有的简单易懂但寻找最优思路并不容易,当然还有一些题目可以转化成一种基本套路,有的题存在一定相似处,我们怎么把复杂的题目通过分析转化为基本问题,是我现在需要努力的方向,贪心题目广泛多样,求解方式因题而论,但要尽可能找到题目中的关键语句,努力寻找最优解,这还需要我们反复练习,许多题目同型不同题,同题不同型,我们要在多种题目中不断总结,才能不断强化,做到看题就会,一写就对。

猜你喜欢

转载自blog.csdn.net/weixin_51443397/article/details/114902280
今日推荐