问题描述:
给定由n个整数组成的序列,求其连续子序列和的最大值。例如当序列为{-2,11,-4,13,-5,-2}时,其最大字段和为20,即{11,-4,13}。
算法分析:
我们用动规的思想来解这道题。引入数组b
,b[i]
表示式子a[k]+a[k+1]+a[k+2]+···+a[i]
的最大值(k
取[0,i]
内任意整数值)。
ps:这里b[i]
的定义一定要弄清楚了,不是a[0]
到a[i]
的最大子段和。
弄明白这个概念后,我们就可以轻易想到,若b[i-1]<0
,则b[i]
应当直接等于a[i]
;否则b[i]=b[i-1]+a[i]
。这就是核心的递推式,我们直接历遍序列,找出最大的b[i]
即可。同时可空间优化,直接用b
代替b
数组表示。
完整代码:
#include <iostream>
#include <vector>
using namespace std;
// 最大子序列和——动态规划
// b[i-1]>0时,b[i]=b[i-1]+a[i];否则 b[i]=a[i];
int longest_son(vector<int> a, int left, int right)
{
int b = 0;
int sum = 0;
while (left <= right)
{
if (b > 0)
b += a[left++];
else
b = a[left++];
if (b > sum)
sum = b;
}
return sum;
}
int main()
{
vector<int> a = {-2, 11, -4, 13, -5, -2};
cout << longest_son(a, 0, a.size() - 1) << endl;
}