贪心算法(入门)字典序最小问题&最小覆盖问题

Posted 中学生编程与信息学竞赛自学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心算法(入门)字典序最小问题&最小覆盖问题相关的知识,希望对你有一定的参考价值。

本课程是从少年编程网转载的课程,目标是向中学生详细介绍计算机比赛涉及的编程语言,数据结构和算法。编程学习最好使用计算机,请登陆 www.3dian14.org (免费注册,免费学习)。


字典序最小问题(Best Cow Line, POJ3617)

给定长度为N的字符串S,构造一个新字符串T:

每一步从S的头部或者尾部删除一个字符,加到T的尾部。

要求:T的字典序(在字典中的位置,也就是字母排序)尽可能的小。

例如: 

                          S= “TGH”

                          T=“HELLO”

          1. 如果取S的头字符:  

                          S= “GH”

                          T=“HELLOT”

         1. 如果取S的尾字符:  

                          S= “TG”

                          T=“HELLOH”


编程技巧:定义2个变量,一个指向数组头,一个指向数组尾部,然后向数组中间遍历。也就是数组中的双指针技巧

贪心算法(入门)字典序最小问题&最小覆盖问题



最小覆盖问题( Saruman's Army POJ 3069)

直线上有N个点,从这N个点中选取若干个作为圆心,画半径为R的圆。我们需要选取最少的点, 同时让圆覆盖所有N个点。

贪心算法(入门)字典序最小问题&最小覆盖问题

解决问题的策略也是贪心算法。



贪心算法的时代局限

假如你穿越到仙界,找到仙丹(重1克,价值150元),仙草(重2克,价值200元),和灵石(重4克,价值300元),可惜纳戒的容量有限,只能装4克仙物。你该如何取舍呢? 

                           

最简单的办法是暴力求解:尝试各种可能的组合,找出价值最高的一个。这里总共有3种物品,有种组合,如果有4件物品,就需要计算种组合,如果有100种物品,即使我们每秒可以计算1万种组合,也需要计算年。暴力解法显然行不通,这时候贪心算法往往能得到比较满意的解答。

贪心算法的核心是:活在当下。每一步都选当前所见最优秀的解,也就是局部最优解。这里的贪心策略是每次都选价值最大的物品:首先把最值钱的灵石塞进纳戒,现在纳戒装满了。完美往往是优秀的敌人,贪心算法没有找到最优解:走私仙草和仙丹,价值是350元。(摘自俺的《共演化,一种新的世界观》)

         

以上是关于贪心算法(入门)字典序最小问题&最小覆盖问题的主要内容,如果未能解决你的问题,请参考以下文章

8.7贪心策略例题:字典序最小问题

Codeforces 980 并查集/模拟贪心最小字典序

BZOJ 1640 [Usaco2007 Nov]Best Cow Line 队列变换:贪心字典序最小

最小表示法 (模板)

力扣 第314场周赛 6202. 使用机器人打印字典序最小的字符串难度:中等(栈+贪心)

51nod 1255 贪心/构造