1.问题描述
给定有n个整数(可能为负整数)组成的序列a1,a2,…,an,求该序列连续的子段和的最大值。 如果该子段的所有元素和是负整数时定义其最大子段和为0。
2.算法
1)穷举法(简单暴力,莽就完了)
#include<stdio.h>
using namespace std;
int method(int arr[],int count)
{
int thissum, maxsum = 0;
for(int i = 0;i < count;i++)
{
for(int j = i;j < count;j++)
{
thissum = 0;
for(int k = i; k < j;k++)
{
thissum += arr[k];
if(thissum > maxsum )
{
maxsum = thissum;
}
}
}
}
return maxsum;
}
int main()
{
int arr[10] = { 4,-3,5,-2,-1,2,6,-2 };
int count = 10;
int sum = method(arr, count);
printf("%d", sum);
}
时间复杂度:O(n^3);最为复杂
2)优化穷举法(在穷举法的基础上进行了一定的优化,显得不再呢么无脑)
#include<stdio.h>
using namespace std;
int method(int arr[],int count)
{
int thissum, maxsum = 0;
for(int i = 0;i < count;i++)
{
thissum = 0;
for(int j = i;j < count;j++)
{
thissum += arr[j];
if(thissum > maxsum )
{
maxsum = thissum;
}
}
}
return maxsum;
}
int main()
{
int arr[10] = { 4,-3,5,-2,-1,2,6,-2 };
int count = 10;
int sum = method(arr, count);
printf("%d", sum);
}
时间复杂度:O(n^2)(较为复杂)
3)分治法
#include<iostream>
#include<stdio.h>
using namespace std;
int method(int arr[],int left,int right)
{
int sum = 0;
if(left == right)
{
return left > 0 ? left : 0;
}
int mid = (left + right) / 2;
int leftsum = method(arr, left, mid);
int rightsum = method(arr, mid + 1, right);
int left_sum = 0;
int right_sum = 0;
int s1 = 0;
int s2 = 0;
for(int i = mid ; i >= left;i-- )
{
left_sum += arr[i];
if(left_sum > s1)
{
s1 = left_sum;
}
}
for(int i = mid+1; i <= right; i++)
{
right_sum += arr[i];
if (right_sum > s2)
{
s2 = right_sum;
}
}
sum = s1 + s2;
if(sum < leftsum)
{
sum = leftsum;
}
if(sum < rightsum)
{
sum = rightsum;
}
return sum;
}
int main()
{
int arr[10] = { 4,-3,5,-2,-1,2,6,-2 };
int sum = method(arr,0,9);
printf("%d", sum);
}
时间复杂度:O(nlogn)较为简单
4.动态规划法
#include<stdio.h>
using namespace std;
int method(int arr[],int count)
{
int thissum = 0 ,maxsum = 0;
for(int i = 0;i < count;i++)
{
thissum += arr[i];
if(thissum > maxsum)
{
maxsum = thissum;
}
else if (thissum < 0)
{
thissum = 0;
}
}
return maxsum;
}
int main()
{
int arr[10] = { 4,-3,5,-2,-1,2,6,-2 };
int sum = method(arr,9);
printf("%d", sum);
}
时间复杂度:O(n);最简单