求最大的子序列这里用到了一个比较巧妙的遍历的方法。
首先,设置start和end为字符串的两端,还有一个p为0.
还有一个当前的sum = 0,和最大的maxSum = -1.
因此,对序列进行遍历,将数字加入sum中,如果sum小于0,就说明,当前位置到p的序列和是小于0的,不可能是最大的序列,因此要将p设置为当前位置的下一个。
但是,如果求出的sum大于0,我们还不可以更新最大的序列,要与maxSum作比较才可以,如果大于maxSum就更新最大子序列。保证记录的最大子序列一定为最大子序列。
#include <cstdio>
int main()
{
int length;
scanf("%d", &length);
// 使用动态规划
// 字串的左下标不能轻易修改
int * sequence = new int[length];
for (int i = 0; i < length; i++)
{
scanf("%d", &sequence[i]);
}
int sum = 0;
int maxSum = -1;
int start = 0;
int end = length - 1;
int p = 0;
for (int i = 0; i < length; i++)
{
sum += sequence[i];
if (sum < 0)
{
sum = 0;
p = i + 1;
}
else if (sum > maxSum)
{
start = p;
end = i;
maxSum = sum;
}
}
if (maxSum < 0)
maxSum = 0;
printf("%d %d %d", maxSum, sequence[start], sequence[end]);
return 0;
}