【基本概念】
- 贪心算法:在对问题求解时,总是做出在当前看来是最好的选择,也就是说,不从整体最优上加以考虑,所作出的仅是某种意义上的局部最优解。
- 贪心策略:在每个阶段,都作出一个按照某个评价函数最优的决策,这个评价函数最优称为贪心准则(类似于动态规划的状态转移方程)。
- 基本过程:在求最优解问题的过程中,依据某种贪心标准,从问题的初始状态出发,直接去求每一步的最优解,通过若干次的贪心选择,最终得出整个问题的最优解。
一般而言,对于贪心问题,根据贪心策略对输入数据进行排序是第一步。 - 实用问题:局部最优策略能导致产生全局最优解。
【性质】
- 贪心选择性质:贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
- 最优子结构性质:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质,问题的最优子结构性质是该问题可以用动态规划或者贪心算法求解的关键特征。
【一般步骤】
- 建立数学模型来描述问题;
- 把求解的问题分成若干个子问题;
- 对每一子问题求解,得到子问题的局部最优解;
- 把子问题的局部最优解合成原来问题的一个解。
【实现框架】
简单来说,就是根据要求,不断选择最大/最小的,直到满足/不满足条件为止
/*
候选集合A:问题的最终解均取自于候选集合A。
解集合S:解集合S不断扩展,直到构成满足问题的完整解。
解决函数solution:检查解集合S是否构成问题的完整解。
选择函数select:贪心策略,这是贪心算法的关键。
可行函数feasible:解集合扩展后是否满足约束条件。
*/
Greedy(A)
{
S={ };//初始解集合为空集
while (not solution(S))//集合S没有构成问题的一个解
{
x=select(A);//在候选集合A中做贪心选择
if feasible(S, x)//判断集合S中加入x后的解是否可行
S = S+{x};
A = A-{x};
}
return S;
}
【经典问题】
【例题】
1.入门
- 数列分段Section I(洛谷-P1181):点击这里
- 纪念品分组(洛谷-P1094):点击这里
- 凌乱的yyy(洛谷-P1803):点击这里
- 合并果子(洛谷-P1090):点击这里
- 整数区间(信息学奥赛一本通-T1324):点击这里
- 拦截导弹问题(信息学奥赛一本通-T1322):点击这里
- 书架(信息学奥赛一本通-T1228):点击这里
- 接水问题(信息学奥赛一本通-T1233):点击这里
- Yogurt factory(POJ-2393):点击这里
- Turn the Rectangles(CF-1008B):点击这里
- 均分纸牌(洛谷-P1031)(经典,贪心策略的选择):点击这里
同题:均分纸牌(信息学奥赛一本通-T1320):点击这里
2.结构体的使用
- 混合牛奶(洛谷-P1208):点击这里
- 排队接水(洛谷-P1223):点击这里
同题:排队接水(信息学奥赛一本通-T1319):点击这里 - Ride to Office(信息学奥赛一本通-T1227):点击这里
- 金银岛(信息学奥赛一本通-T1225):点击这里
- Sunscreen(POJ-3416):点击这里
- Protecting the Flowers(POJ-3262):点击这里
- Polycarp’s Practice(CF-1006B):点击这里
- 处女座的期末复习(2019牛客寒假算法基础集训营 Day2-J):点击这里
- 处女座的训练(2019牛客寒假算法基础集训营 Day3-D):点击这里
- 项链(2019牛客寒假算法基础集训营 Day6-C):点击这里
- Supermarket(POJ-1456)(优先队列的使用):点击这里
3.细节处理
- 电池的寿命(信息学奥赛一本通-T1229):点击这里
- 删数问题(信息学奥赛一本通-T1321):点击这里
- 装箱问题(信息学奥赛一本通-T1226):点击这里
- 寻找平面上的极大点(信息学奥赛一本通-T1230):点击这里
- Muddy roads(POJ-2437):点击这里
- Expedition(POJ-2431):点击这里
- Cow Acrobats(POJ-3045):点击这里
- Songs Compression(CF-1015C):点击这里
- Annoying Present(CF-1009C):点击这里
- Sonya and Hotels(CF-1004A):点击这里
- Balloons(CF-998A):点击这里
- 超级赛亚ACMer(HDU-5246):点击这里
- Sequence(BZOJ-1345):点击这里
- 美食(2019牛客寒假算法基础集训营 Day6-D):点击这里
4.其他
- Minimum Value Rectangle(CF-1027C)(数学推导):点击这里
- Cutting(CF-998B)(数学推导):点击这里
- Convert to Ones(CF-998C)(数学推导):点击这里
- 活动选择(信息学奥赛一本通-T1323)(活动选择问题):点击这里
- Allowance(POJ-3040)(小数背包问题):点击这里
- Polycarp and Div3(CF-1005D)(前缀和):点击这里
- 国王游戏(洛谷-P1080)(高精度优化):点击这里
- Best Cow Line(POJ-3617)(字典序):点击这里
- Stages(CF-1011A)(字符处理):点击这里
- 最小新整数(信息学奥赛一本通-T1231)(字符数组的应用):点击这里
- An Easy Problem(信息学奥赛一本通-T1223)(进制转换):点击这里
- 小a与”204″(2019牛客寒假算法基础集训营 Day1-B)(贪心+构造):点击这里