如果直接遍历序列得到各种和会超时,查询了一下大家都说使用动态规划,而动态规划又不是一种算法,只是一种思路,要具体问题具体分析。
认真读了一下大神们的代码,整理了一下思路,写下来,提供给向我这样的解题小白。
---------------------------------------------------------思路--------------------------------------------------------------
我们一般的思路会认为,把所有能够组合的子串全部加一遍,取得最大的,我们也都知道这样很耗费时间。所以我们把这个问题分解一下。
首先我们应该承认的一点是,如果我们从第一个数字开始加,加到第k个数字,当加上第k个数字以后,和为负数,那么可以断定,第k个数字一定是负数且绝对值比前k-1个数字的和还要大。
这样一来,我们可以把这个数列分组,使得每一组的和是一个负数(最后一组可能不是,因为可能无法得到和为负数的情况数列就到头了),分为两种情况:
1.这个组中只有一个数且是负数,这种情况来自于当把前一组分好以后,接下来的第一个数就是一个负数,这样一来和就是它本身是一个负数。
2.这一组是一串数字,他们的和为负数,这个子串有一个特点就是他的第一个数一定是一个正数,最后一个数一定是负数。
这样分组的目的是什么呢?如果前面的数字和是负数,我们加在新的数字上就是浪费,那样会使得新的结果更加的小,所以我们不在继续加下去,而是适可而止,从0开始从头算。各位同学可以算一下,上面说到的子串的最大值一定是从第一个数开始加到某一个数字得到的。因为从第一个开始和一直是正数,往后继续加一定会使得后面的数越来越大,所以不可能是从后面的数开始的子串得到和最大,比如7、-6、5, 7-6=1加在5上使得5变大了,所以任何非第一个数字开始的子串和都不可能得到最大值。(大家可以多写几个例子试一试)
那么我们回到思路的第一行,我们计算所有子串的和很麻烦。那如果我有一个数列,我从第一个数加到最后一个数,记录这个过程中得到的最大值,很容易吧?
这样一来,我们就把这个问题简化成计算每一组数从第一个数加到最后一个数的过程中的得到的最大值,然后所有组的最大值的最大值就是我们需要的结果。
----------------------------------------------------------------------------------------------------------------------------
我们给一个例子:-7、2、5、1、-3、-5、-1、6、11、-19、-5、9、4、-3、7、-2、-6、-10、10
我们第一步分组,我们可以分为以下几组:
(-7)(2、5、1、-3、-5、-1)(6、11、-19)(-5)(9、4、-3、7、-2、-6、-10)(10)
然后我们分别计算每一组的最大值得到如下结果:
(-7)(8)(17)(-5)(17)(10)
于是我们得到了最后的结果:17
我也不知道我能不能写的清楚明白,这是很简单的一道题,或许我写的复杂了,希望大家批评指正,我一定虚心学习。
324

被折叠的 条评论
为什么被折叠?



