求最大的子序列这里用到了一个比较巧妙的遍历的方法。
首先,设置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;
}
本文介绍了一种求解最大子序列和的高效算法。通过遍历序列并维护当前和与最大和,当当前和小于0时重置起始位置,从而找到最大子序列。文章提供了详细的算法步骤和C++实现代码。
913

被折叠的 条评论
为什么被折叠?



