这道题是DP的入门题,以前在ACM的时候做过,但告别ACM已经一年多了,重新捡起来写了一下,也是今年腾讯实习生招聘的一道笔试题。
#include <iostream>
using namespace std;
int MaxSeqSum(const int A[], int N) //o(n^2)
{
int i, j;
int s1, s2;
s1 = s2 = 0;
for (i = 0; i < N; i++)
{
s1 = 0;
for (j = i; j < N; j++)
{
s1 += A[j];
if (s1 > s2)
{
s2 = s1;
}
}
}
return s2;
}
int MaxSeqSum2(const int A[], int N) // o(N)
{
int s1, s2, j;
s1 = s2 = 0;
for (j = 0; j < N; j++)
{
s1 += A[j];
if (s1 > s2)
{
s2 = s1;
}
else if (s1 < 0)
{
s1 = 0;
}
}
return s2;
}
int MaxSeqSum3(const int A[], int N) //和方法2一样的解法,只是简化了一下代码
{
int i;
int nStart = A[0];
int nAll = A[0];
for (i = 1; i < N; i++)
{
nStart = max(nStart, 0);
nAll = max(nStart += A[i], nAll);
}
return nAll;
}
int main()
{
int a[20];
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
cout << "该序列的最大子段和为:" << MaxSeqSum2(a, n) << endl;
return 0;
}