最大子段和

来源:互联网 发布:场地租用费淘宝 编辑:程序博客网 时间:2024/05/18 10:58

要求:给一个数组如:-1,12,9,-5,3,7,-11,7,是求取其的一个子段,要求子段和最大,要求输出最大和,子段的开始位置,子段的结束位置。

思路:暴力法可以做,而且代码也很简单,只有两个循环,但是对于元素比较多的数组时间复杂度会很大。

过程:
这里写图片描述
c++代码:

#include <iostream>using namespace std;int main(){    int *num,n,i,*this_sum,sum=0,best_i=0,best_j=0;    cout<<"Please cin the length of num:";    cin>>n;    num=new int[n+1];    this_sum=new int[n+1];    cout<<"Please cin the num:";    for(i=1;i<=n;i++)        cin>>num[i];    this_sum[0]=0;    if(num[1]>=0)  //如果没有这一步那么当起始位置为1时结果会输出起始位置为0        best_i=1;    for(i=1;i<=n;i++)    {        if(this_sum[i-1]>=0)      //因为这一步的判断条件为>=0,所以要增加上一步best_i置1的情况            this_sum[i]=this_sum[i-1]+num[i];        else        {            this_sum[i]=num[i];            if(this_sum[i]>sum)   //在这种情况下只有当当前的this_sum比sum大时才能真正的改变当前起始位置                best_i=i;        }        if(this_sum[i]>sum)        {            best_j=i;     //只有当当前的this_sum比sum大时才能改变当前best_j            sum=this_sum[i];        }    }    cout<<"best_sum:"<<sum<<"  best_i:"<<best_i<<"  best_j:"<<best_j<<endl;    return 0;}
0 0
原创粉丝点击