题目来源:
https://leetcode.com/problems/maximum-subarray/discuss/20193/DP-solution-and-some-thoughts
题目分析:
本题的意思很简单,即给出一个数列,输出这个数列的最大字段和。比如:[−2,1,−3,4,−1,2,1,−5,4],最大子段和是[4,-1,2,1]答案是6。
显然,这是一个优化问题,通常可以用DP来解决。DP意思是动态规划。动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。不像前面所述的那些搜索或数值计算那样,具有一个标准的数学表达式和明确清晰的解题方法。动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。因此除了要对基本概念和方法正确理解外,必须具体问题具体分析,以丰富的想象力去建立模型,用创造性的技巧去求解。
动态规划算法的基本思想是:将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解;对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并把答案保存起来,让以后再次遇到时直接引用答案,不必重新求解。动态规划算法将问题的解决方案视为一系列决策的结果,与贪婪算法不同的是,在贪婪算法中,每采用一次贪婪准则,便做出一个不可撤回的决策;而在动态规划算法中,还要考察每个最优决策序列中是否包含一个最优决策子序列,即问题是否具有最优子结构性质。
当涉及到DP时,我们首先要弄清楚的是子问题的格式(或每个子问题的状态),当我们试图提出递归关系时,子问题的格式可能会有所帮助。本题,我们可以这样想:为了计算sum(0,i),你有2个选择,一是对a[i]加上原先计算的sum(0,i-1),或者不加,这取决于前面的sum是正值还是负值。如果为正,则加上,否则不加。
解决代码:
class Solution:
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
sum=0;ma=nums[0]
for i in range(len(nums)):
if(sum<0):
sum=nums[i]
else:
sum+=nums[i]
ma=max(ma,sum)
return ma