求最大序列和

作者: 故梦_三笙 | 来源:发表于2019-04-15 11:02 被阅读2次

    有两种解法,首先看我的错误解法#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]表示什么想不通.

    相关文章

      网友评论

        本文标题:求最大序列和

        本文链接:https://www.haomeiwen.com/subject/ronywqtx.html