话不多说,直接上代码清楚明白。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
//蛮力法,逐次找到各个长度的子段然后比较各个子段和的大小
int bfmax(int array[],int n)
{
int sum,max=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
sum=0;
for(int x=i;x<=j;x++)
sum+=array[x];
if(sum>max)
max=sum;//若此时长度大于max,则更新max
}
return max;
}
//时间复杂度 :O(n^3)
//改进后蛮力法,减少一个嵌套,直接在j往后轮的时候算出sum
int bfmax2(int array[],int n)
{
int sum,max=0;
for(int i=0;i<n;i++)
{
sum=0;
for(int j=i;j<n;j++)
{
sum+=array[j];
if(sum>max)
max=sum;
}
}
return max;
}
//改进后蛮力法时间复杂度:O(n^2).
//动态规划法
int max3(int array[],int n)
{
int sum=0,m=0;
for(int i=0;i<n;i++)
{
if(sum>0) //之前子段和大于0则继续往后加
sum+=array[i];
else
sum=array[i]; //之前的子段和小于等于0当然是直接删掉之前的啦,不然就拖后腿了!然后重新从后一个开始计算。
if(m<sum)
m=sum;//若m比sum小,则更新m
}
return m;
}
//动态规划法时间复杂度:O(n).
int main()
{
int a[]={-2,11,-4,13,-5,-2};
int max= max3(a,6);
cout<<"最大子段和为:"<<max<<endl;
return 0;
}
结果截图:
这里仅仅以一个数组例子为例,当然也可以直接改成手动输入的去计算。