最大子串和

来源:互联网 发布:开发一个刷赞软件 编辑:程序博客网 时间:2024/05/19 19:44

最大子串和 根据算法竞赛入门经典实现

/思路:S[i]=A[1]+A[2]+……+A[i];A[j]+A[j+1]+……+A[i]=S[i]-S[j-1]/

/*#include<stdio.h>int max(int a,int b){    if(a>b)    return a;    return b;}int main(){    int B,i,j,n;    int A[1010],S[1010];    scanf("%d",&n);    for(i=1;i<=n;i++)    scanf("%d",&A[i]);    S[0]=0;    for(i=1;i<=n;i++)    S[i]=S[i-1]+A[i];    B=A[1];    for(i=1;i<=n;i++)    {        for(j=i;j<=n;j++)        B=max(B,S[j]-S[i-1]);    }    printf("%d\n",B);     return 0;}*/

改进:只要保证最 小的S[i-1]和最大的S[j]就行了

#include<stdio.h>int max(int a,int b){    if(a>b)    return a;    return b;}int main(){    int B,i,j,n,l,r,x,y;    int A[1010],S[1010];    scanf("%d",&n);    for(i=1;i<=n;i++)    scanf("%d",&A[i]);    S[0]=0;    for(i=1;i<=n;i++)    S[i]=S[i-1]+A[i];    l=r=x=y=1;    for(i=1;i<=n;i++)    {        if(S[l]>S[i])        l=i;        if(S[r]<S[i])        r=i;        if(S[r]-S[l]>(S[x]-S[y]))            {                x=r;                y=l;            }        if(S[i]<0)        {            r=l=i;        }    }    printf("%d\n",S[x]-S[y]);     return 0;}
原创粉丝点击