参考:http://www.cnblogs.com/zhangchaoyang/articles/2012070.html
最大子序列是要找出由数组成的一维数组中和最大的连续子序列。比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大;而 {5,-6,4,2}的最大子序列是{4,2},它的和是6。
思路:用数组P[i]记以i结尾的子序列的和,max记当前子序列的最大和,end记最大子序列和的结束坐标;
if P[i-1]>0:P[i]=P[i-1]+a[i];
else:P[i]=a[i]理解起来就是说,以i结尾的子序列,如果i-1得到的最大子序列是一个负数,那么不管a[i]是多少,加上a[i]之后得到的和总会比a[i]还要小,那还不如舍弃i-1的和,单独留下a[i]反而比加上i-1的和大。还有一种理解是:若P[i-1]+a[i]>a[i]那么P[i]=P[i-1]+a[i]否则P[i]=a[i],这种理解化简一下就是上一种理解。
并且每次更新P[i]的时候,都要去更新max,如果max被更新了,那么end也要更新。最终输出子序列的时候从end开始往前找,直到P[i]<=0为止。
代码如下:时间复杂度O(n) 空间复杂度O(n)
int longestsum(int a[], int n)//动态规划算法 S[i]=max(S[i-1]+a[i] , a[i]) 表示以当前a[i]结尾的最大子序列和
{
//复杂度O(N)
int S[10];//记和
S[0] = a[0];//初始化首位
int end = 0;//结束位置
int max = a[0];//最大值
for (int i = 1; i < n; i++)
{
S[i] = ((S[i - 1] + a[i])>a[i]) ? (S[i - 1] + a[i]) : a[i];
if (S[i] > max)
{
max = S[i];
end = i;
}
}
while (S[end] > 0)
{
cout << a[end] << " ";
end--;
}
cout << endl; cout << max << endl;
return max;
}