关于贪心选择证明的理解,突然有点想不通了。。。
拿最简单的活动安排问题,我在想贪心选择先找f1,然后剩下的2->N逐个找能与之前兼容的活动,按照f 不递减序排列。如果存在一个最优解,第一个活动是k, 那么 k后面的活动自然与 f1 兼容,但是k前面的呢,可能就会与s1 f1 不兼容了,记得当年算法书证明这个挺漂亮的,而且考试还考了一道8分的证明。
后来翻翻书,发现证明过程一个横重要的细节忽视了,不管是贪心解还是 某一个最优解,都要把活动按照f 不递减排序。所以最优解第一个活动一定是解里面活动结束最早的,所以剩下的活动必与 F1兼容。
最优子结构其实就是之前DP的剪切技术,假设E是最优解,如果E'=E-{1} 存在一个更优解,替换掉原最优解,则导致一个全局更优的解,这与之前解是最优产生矛盾,然后每一步贪心产生更小规模的子问题,直至最优解导出。
所以思路就是两步,第一步贪心选择,一定要找到了一个类似于按照活动结束时间排序这样一个预处理,然后在此基础上用替换的方式,发现其他方式产生的最优解最多与贪心产生的最优解一样,不可能更优,因此可以说贪心解最优,因为不要求把所有最优解罗列。
第二步,最有子结构,剪切技术,产生与假设想矛盾,因此不存在里面更优的解。
虽然曹博的PPT,还有扶栏小炒肉大神说过,贪心选择可能是题目的难点,因为证明具有这种性质往往是困难的,所以你不知道你想出的一个贪心策略是否可以达到全局最优解。但是一旦弄出来,就是漂亮的算法,Dijstra(一直对于证明有点疑惑), Prim Kruskal HuffmanCode 等等,效率很高