贪心算法
简介:
所谓贪心算法,就是用将一个大的问题细化成若干小问题,通过逐一解决这些小问题,最终求得问题解的方法。这种策略往往易于描述,易于实现—策略可行的话
理论:
贪心算法是一种在每一步选择中都采取在当前状态下最好或最优的选择,希望得到结果是最好或最优的算法(贪心算法是一种能够得到某种度量意义下的最优解的分级处理方法,通过一系列的选择得到一个问题的解,而它所做的每一次选择都是当前状态下某种意义的最好选择。即希望通过问题的局部最优解求出整个问题的最优解。换句话说,当进行选择时,我们直接做出当前问题中看来最优的选择,而不必考虑子问题求解。)
这种策略是一种很简洁的方法,对许多问题它能产生整体最优解,但不能保证总是有效,因为它不是对所有问题都能得到整体最优解。
利用贪心策略解题,需要解决两个问题:
(1)该题是否适合于用贪心策略求解;
(2)如何选择贪心标准,以得到问题的最优/较优解。
所以,在贪心算法中,我们总是做出当时看来最佳的选择,然后求解剩下的唯一子问题,贪心算法进行选择可能依赖之前做出的选择,但不依赖任何将来的选择或子问题。
例题:hdu 1257
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257
解题思路:利用反向思维,从最后向前,每一次选择的第一个选项以未选中过的末尾开始,依次向前,选择比他大的,交替进行。
代码:
#include<iostream> using namespace std; int hi[30002],n; bool bh[30002]; int fun() { int nu=0,max=0; for(int i=n-1;i>=0;i--) { if(bh[i]==true&&max<=hi[i]) { bh[i]=false; max=hi[i]; nu++; } } return nu; } int main() { while(cin>>n) { int sum=0,t; for(int i=0;i<n;i++) { cin>>hi[i]; bh[i]=true; } while(1) { t=fun(); if(t) sum++; else break; } cout<<sum<<endl; } return 0; }