LeetCode53. Maximum Subarray-python(easy) DP思想
2018-03-25 22:01
423 查看
题目来源:
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
相关文章推荐
- LeetCode-Easy部分中标签为 Dynamic Programming(DP) 53. Maximum Subarray
- Leetcode解题笔记 53. Maximum Subarray [Easy] 动态规划
- [leetcode]53. Maximum Subarray 最大连续子串python实现【medium】
- [leetcode]53. Maximum Subarray 最大连续子串python实现【medium】
- leetcode 53. Maximum Subarray python
- [array] leetcode - 53. Maximum Subarray - Easy
- [LeetCode By Python]53. Maximum Subarray
- LeetCode 53. Maximum Subarray
- leetcode 53. Maximum Subarray
- LeetCode-Easy-Java-Maximum Average Subarray I
- LeetCode 53. Maximum Subarray
- leetcode题解-53. Maximum Subarray && 448. Find All Numbers Disappeared in an Array
- 【LeetCode】53. Maximum Subarray
- Maximum Subarray Leetcode Python
- [LeetCode] 53. Maximum Subarray
- 【leetcode】53. Maximum Subarray
- 【C++】【LeetCode】53. Maximum Subarray
- LeetCode 53. Maximum Subarray
- [leetcode:python]53.Maximum Subarray
- LeetCode解题报告 53. Maximum Subarray [medium]