Dynamic Programming is a method for solving a complex problem by breaking it down into a collection of simpler subproblems, solving each of those subproblems just once, and storing their solutions.

一开始的思绪:
看到这个题目的时候,不知道动态规划的时候,就开始去思考怎么解,总是会胡思乱想,然后没法细致的去拆解问题,从而没有一个着力点。
本题的状态转移方程就很清晰,如果dp(i-1)是负数那么dp(i)就不要和之前的连续数组合在一起。如果是正数,那就合在一起。因为每一步都是最优解,所以结果就是max { dp(i) }。
func maxSubarray(nums: [Int]) -> Int {
if nums.count == 0 { return 0 }
var dp = [Int](repeating: nums[0], count: nums.count)
var maxValue = dp[0]
for (i, value) in nums.enumerated() {
if i >= 1 {
let prev = dp[i - 1]
if prev > 0 {
dp[i] = dp[i-1] + value
} else {
dp[i] = value
}
}
maxValue = max(maxValue, dp[i])
}
return maxValue
}
上面这个算法的时间复杂度是O(n), 空间复杂度也是O(n)。因为记录了每一个dp(i)
func maxSubArray(_ nums: [Int]) -> Int {
if nums.count == 0 { return 0 }
var maxValue = nums[0]
var dp = nums[0]
for i in 1..<nums.count {
if dp > 0 {
dp = dp + nums[i]
} else {
dp = nums[i]
}
maxValue = max(maxValue, dp)
}
return maxValue
}
这个算法的时间复杂度是O(n), 空间复杂度也是O(1)。因为本题不需要记录之前的值,对上面一个算法的优化。
end