求最大序列和

有两种解法,首先看我的错误解法#include<stdio.h>

int main()

{

    int n;

    while(scanf("%d",&n)!=EOF)

    {

        int a[1000000];

        int i,j,num=0,sum=0,temp=0,f=0,idex=0;

        for(i=0;i<n;i++)

            scanf("%d",&a[i]);

for(i=0;i<n;i++)

{

          if(a[i]<=0)

  f++;

}

      if(f==n)

  {

  sum=-100000;

  for(i=0;i<n;i++)

  {

  if(sum<a[i])

  sum=a[i];

  }

  printf("%d",sum);

  continue;

  }


        for(i=0;i<n;i++)

        {

          if(a[i]>0)

  idex++;

            if(idex>0)

{

if(a[i]<0)

            {

  if(temp>0)

  {

  a[num]=temp;

  num++;

  }

                a[num]=a[i];

num++;

                temp=0;

                continue;

            }

            temp+=a[i];

if(i==n-1)

a[num++]=temp;

}

        }

        for(i=0;i<num;i++)

        {

temp=0;

            if(a[i]<0)

            {

                continue;

            }

            for(j=i;j<num;j++)

            {

                temp+=a[j];

                if(sum<temp)

                    sum=temp;

            }

        }

        printf("%d",sum);

    }

return 0;

}

这种解法是我自己想的,大概思路就是把连续的正数加起来当做一个数。比如 1 2 -1 -2这四个数就相当于3和-1 -2。这样就简化了一点,然后按照这个新的数组遍历,每次求出以某一个数开始的数列的最大值,如果第一个数是负数,那么就可以跳过,因为第一个是负数,加上他肯定会小。这种方法还要考虑到全部都是负数的情况。但是这样时间还是太大,比如间断的,1 -2 3 -4 5 -6.。。这样的,那么时间肯定会蹦,所以我这种菜鸡写的就被out了,来看大佬的解法。



解法一

#include<stdio.h>

int main()

{

    int n;

    while(scanf("%d",&n)!=EOF)

    {

      int i,x,sum=0,max=-20000;

        for(i=0;i<n;i++)

        {

            scanf("%d",&x);

    sum+=x;

            if(max<sum)

                max=sum;

            if(sum<0)

                sum=0;

        }

        printf("%d",max);

    }

return 0;

}

这种解法的关键就是没输入一个数字就加进去,每次最大的值保存下来,如果加入一个数为0后就从0开始,因为如果累加到和为负数的时候,说明前面的最大和已经求出来了,所以就从0开始。给大佬跪下。



解法二:动态规划


dp[i]表示以a[i]为结尾的最大和。所以每次只要比较dp[i-1]+a[i]和dp[i]的最大值就可以。还是不知道动态规划怎么想,就是dp[i]表示什么想不通.

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容