贪心算法(入门)字典序最小问题&最小覆盖问题
本课程是从少年编程网转载的课程,目标是向中学生详细介绍计算机比赛涉及的编程语言,数据结构和算法。编程学习最好使用计算机,请登陆 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元。(摘自俺的《共演化,一种新的世界观》)