给定一个含有N整数的序列,求其最大子列和(即该序列中一段连续子序列和的最大值)。
大致思路是:定义一个当前位置之前的序列和的最大值(maxSum)以及当前子序列的和(thisSum),每迭代一次比较二者的大小关系,如果maxSum小于thisSum,则更新maxSum,否则继续遍历。当thisSum<0时,需要将thisSum重置为0,即求下一段子序列的和。
需要注意的是:最大子列和所在序列中可能含有负数,所以不能遇到负数便舍弃当前的序列和。
以下为代码实现:
#include <iostream>
using namespace std;
int MaxSum(int *s, int n);
int main()
{
int n;
int s[100000]; //数组大小视情况而定
cin >> n;
for(int i = 0; i < n; ++i){
cin >> s[i];
}
cout << MaxSum(s,n);
return 0;
}
int MaxSum(int *s,int n)
{
int maxSum = 0, thisSum = 0;
for (int i = 0; i < n; ++i){
thisSum += s[i];
//若最大子列和和小于当前子序列的和,更新最大子列和
if(maxSum < thisSum)
maxSum = thisSum;
//当前子序列和小于0,舍弃之前的值,开始下一段序列
else if(thisSum < 0)
thisSum = 0;
}
return maxSum; //返回最大子列和
}