题目
在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和
解答
动态规划
dp[i]表示下标为i时的最大连续子序列和。注意,这里的dp[i]是一定会包含array[i]的,这满足了连续的条件。但是,若dp[i]是负值,那么dp[i]则不会是正确结果。
dp[i] = max(dp[i-1]+array[i], array[i]);
因此,还需要
ret = max(ret, dp[i]);
但是你又不能写成下面这样,无法满足连续的条件。
dp[i] = max(dp[i-1]+array[i], array[i], dp[i]);
代码
class Solution {
public:
int FindGreatestSumOfSubArray(vector<int> array) {
int n = array.size();
int *dp = (int*)malloc(n*sizeof(int));
memset(dp, 0, n*sizeof(int));
dp[0] = array[0];
int ret = -0x7fffffff;
for(int i = 1; i < n; i++){
dp[i] = max(dp[i-1]+array[i], array[i]);
ret = max(ret, dp[i]);
}
free(dp);
return ret;
}
};