1.最大子列和问题
1.二次循环,复杂度n^2
#include<stdio.h>
#define NU 100000
int findson(int a, int b[])
{
int thissum,msum;
msum = 0;
for (int i = 0; i < a; i++)
{
thissum = 0;
for (int j = i; j < a; j++)
{
thissum += b[j];
if (thissum > msum)
{
msum = thissum;
}
}
}
return msum;
}
int main()
{
int a;
scanf("%d", &a);
int b[NU];
for (int i = 0; i < a; i++)
{
scanf("%d", &b[i]);
}
printf("%d",findson(a,b));
return 0;
}
2.搜到的大佬的答案复杂度o=n
惊了!
int MaxSubseqSum4( int A[], int N ) {
int ThisSum, MaxSum, i;
ThisSum = MaxSum = 0;
for( i = 0; i < N; i++ ) {
ThisSum += A[i]; /* 向右累加 */
if( ThisSum > MaxSum )
MaxSum = ThisSum; /* ·发现更大和则更新当前结果 */
else if( ThisSum < 0 ) /* 如果当前子列和为负数 */
ThisSum = 0; /* 则不可能使后面的部分和增大,抛弃之 */
}
return MaxSum;
}
3.分而治之T(n) = O(nlogn)
精了
int Max(int A, int B, int C) {
return (A > B) ? (A > C ? A : C) : (B > C ? B : C);
}
int divideandbonder(int list[], int left, int right)
{
if (left == right)
{
if (list[left] > 0)
return list[left];
else
{
return 0;
}
}
int mmleftsum, maleftsum;
int mmrightsum, marightsum,center;
center = (left + right) / 2;
maleftsum = 0; mmleftsum = 0; mmrightsum = 0; marightsum = 0;
mmleftsum = divideandbonder(list, left, center);
mmrightsum = divideandbonder(list, center + 1, right);
for (int i = 0; i < left; i++)
{
maleftsum += list[i];
if (maleftsum > mmleftsum)
{
mmleftsum = maleftsum;
}
}
for (int i = center + 1; i < right; i++)
{
marightsum += list[i];
if (marightsum > mmrightsum)
{
mmrightsum = marightsum;
}
}
return Max(mmleftsum, mmrightsum, mmleftsum + mmrightsum);
}
int findson(int a, int b[])
{
return divideandbonder(b, 0, a);
}
之后还会更