对最大子列和的深度研究

对于最大子列和的问题,大家应该都很熟悉了。用DP算法能很快速简便的求出SUM的问题,但对于子列的开头和结尾,还是一个值得深究的问题。

   一、不要求开头,结尾序号 ,只要求值的情况

以PTA上的测试点为例:

   其实难点在于数列全为0、全为负、0与负混合的三种情况。

  若全0,则输出为0  0  0;

  若全为负,则输出为 0  a[0]  a[n-1]

  若0负混合,则输出为 0  0  0。

  那么我们很自然想到,让两个结果变量left=right=0,然后设置一个标志位,当检测到全负时,则left=a[0],right=a[n-1]。

  那么代码就很容易写出来了:

#include<stdio.h>
    int f4(int a[],int n){
    int i,max=0,now=0,l=0,r=0,flag=0;
    a[10001]=0;a[10002]=0;
       
    for(i= 0;i<n;i++){
        if(a[i]>=0)
            flag=1;

        if(now<0){
            l=i;
            r=i;        
            now=a[i];   //刚吸收的数可能非常大,所以必须更新l与r
        }
        else {
            r=i;
            now+=a[i];
        }

        if(now>max){
             max=now;
             a[10002]=a[r];
             a[10001]=a[l];
        }

    }
        if(!flag){
            a[10001]=a[0];
            a[10002]=a[n-1];
           }

        return max;
}
      int main(){
      int i,n;
      scanf("%d",&n);
      int a[10002];
      for(i=0;i<n;i++)
      scanf("%d",&a[i]);

      int sum=f4(a,n);
      printf("%d %d %d",sum,a[10001],a[10002]);

    return 0;
}


发布了8 篇原创文章 · 获赞 1 · 访问量 197

猜你喜欢

转载自blog.csdn.net/Moby97/article/details/78358596