我觉得有必要,谈论一下为什么这道题的dp公式是:
dp[i] = max(dp[i-1] + array[i], array[i]);
dp[i]的含义就是,加上第i个数组元素,当前最大和的子数组的和是多少,必须是加上加上第i个数组元素的。由于第i个数组元素,可能为正,也可能为负,那么为正,自然最大和是增长的,为负则最大和是有损的,也就是当前最大的子数组加上array[i]之后,这个子数组和需要付出的代价。
当然如果加上这个array[i]子数组付出的代价太大,大到不如不加,那么最大子数组就有两种情况:不管dp[i-1]为正为负,那么加上array[i](为负值)肯定都会更小:
1)第1种情况是,dp[i-1]为正,那么加上array[i],dp[i]比array[i]自己大,但不知道大多少,只要前面是正的,加上前面dp[i-1]对dp[i]就合算;
2)第2种情况是,dp[i-1]为负,那么加上array[i],比array[i]自己还小,加上前面dp[i-1]对dp[i]非常不合算,还不如不加dp[i-1],前面一堆负数就是个累赘,所以单算array[i]自己作为dp[i]是合适的,大子数组和在array[i]之后的概率比较大。
同理,array[i]为正数时,也需要论dp[i-1]的正负数情况:
if array[i] > 0: // array[i]为正数
if (dp[i-1] > 0)
dp[i] = dp[i-1] + array[i];
else:
dp[i] = array[i];
else: // array[i]为负数
if (dp[i-1] > 0)
dp[i] = dp[i-1] + array[i];
else:
dp[i] = array[i];
所以:dp[i] = max(dp[i-1] + array[i], array[i]);
class Solution {
public:
int FindGreatestSumOfSubArray(vector<int> array) {
int size = array.size();
int sum[size];
sum[0] = array[0];
int max1 = sum[0];
for (int i = 1; i < size; i++) {
sum[i] = max(sum[i-1] + array[i], array[i]);
if (max1 < sum[i]) {
max1 = sum[i];
}
}
return max1;
}
};