From f606c12b3e035d94a34e743fca333d2e43683685 Mon Sep 17 00:00:00 2001 From: pezy Date: Fri, 10 Apr 2015 08:59:21 +0800 Subject: [PATCH] fixed #10 --- 014. Maximum Subarray/README.md | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/014. Maximum Subarray/README.md b/014. Maximum Subarray/README.md index daeb399..87dc94c 100644 --- a/014. Maximum Subarray/README.md +++ b/014. Maximum Subarray/README.md @@ -1,5 +1,16 @@ -这道题我一看到,我就想到了我的最爱——**[贪心算法](http://zh.wikipedia.org/wiki/%E8%B4%AA%E5%BF%83%E6%B3%95)**,太典型了好么。 -求拥有最大**和**的子序列,那么秉承贪心原则,假设初始解为A[0],那么我增加一个元素(A[1]),我就需要考虑,我的利益是多了,还是损失了。 +~~这道题我一看到,我就想到了我的最爱——**[贪心算法](http://zh.wikipedia.org/wiki/%E8%B4%AA%E5%BF%83%E6%B3%95)**,太典型了好么。 +求拥有最大**和**的子序列,那么秉承贪心原则,假设初始解为A[0],那么我增加一个元素(A[1]),我就需要考虑,我的利益是多了,还是损失了。~~ + +经 @Mooophy 在 [issue](https://github.com/pezy/LeetCode/issues/10) 里指出,下述思路并不属于贪心的范畴。荣誉属于 DP,另外得知它有一个历史名字:[Kadane's algorithm](http://en.wikipedia.org/wiki/Maximum_subarray_problem). + +---- +**贪心法与 DP 的最大区别在于**: + +- 动态规划讲究"**记录历史**"以及"**根据历史记录做出最优选择**"。 +- 贪心法对历史无记录,每一次是根据 **当前情况做出最优选择**。 + +---- + 由于题意要求,子序列至少要连续,所以没可能跳过 A[1], 只有两个选择: 1. A[0] + A[1] @@ -17,13 +28,9 @@ maxv = max(benefited, maxv); 聪明的你一定发现了,第一句条恰是**当权者的决策**,第二条恰是**历史学家的总结**。 横批:人类是贪婪的。 -所以不要怪任何一方,从他们的立场看,都是最优解。局部最优能否导致整体最优呢? 千年谜题。 - ------- +**由于我们累计了 `benefited`,并根据其值进行每一次选择。故该解法的本质是 DP 而非贪心。** -题目比较基础,扯了点政治与历史。谁说计算机与人文不是密切相关的。。。 - ------- +----- 另外,该题下面说到 More practice, 提到要用分治法?我没什么思路,请明白者提点。 @@ -33,7 +40,7 @@ maxv = max(benefited, maxv); ----- -@Mooophy 应约而出,给出了[代码](#8),我根据其代码,尝试分析一下分治法的策略: +@Mooophy 应约而出,给出了[代码](https://github.com/pezy/LeetCode/pull/9/files),我根据其代码,尝试分析一下分治法的策略: 分治法的灵魂在于一个 **"分"** 字。对于这道题而言,求`A`的最大和子序列,可以给`A`来一刀: