zoukankan      html  css  js  c++  java
  • 子串和

    子串和

    时间限制:5000 ms  |  内存限制:65535 KB
    难度:3
     
    描述
    给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最大,其中,1<=x<=y<=n。
     
    输入
    第一行是一个整数N(N<=10)表示测试数据的组数)
    每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的一行里有n个整数I(-100=<I<=100),表示数列中的所有元素。(0<n<=1000000)
    输出
    对于每组测试数据输出和最大的连续子串的和。
    样例输入
    1
    5
    1 2 -1 3 -2
    
    样例输出
    5


                d[i]=max{d[i-1]+a[i],a[i]}  如果d[i-1]>0 则为前面 如果d[i-1]<=0,则为后面

    # include<stdio.h>
    int main()
    {
    int N,i,j;
    scanf("%d",&N);
    while(N--)
    {
    int n,max;
    scanf("%d",&n);
    int a[n],d[n];
    for(i=0;i<n;i++)
    {
    scanf("%d",&a[i]);
    }
    d[0]=a[0];
    max = a[0];/////确保特殊情况n=1时max输出a[0]的值
    for(i=1;i<n;i++)
    {
    if(d[i-1]>0)
    {
    d[i]=d[i-1]+a[i];
    }
    else
    {
    d[i]=a[i];
    }
    if(max<d[i])  ///挑选出最大的d[i]
    {
    max=d[i];
    }
    }
    printf("%d ",max);
    }
    return 0;
    }

    最优代码


    #include<stdio.h>
    int main()
    {
    int n,m,i,max,sum;
    scanf("%d",&n);
    while(n--)
    {
    max=0;
    scanf("%d",&m);
    scanf("%d",&sum);
    max=sum;
    while(--m) 
    {
    scanf("%d",&i);
    if(sum<0) sum=i;///这段代码的优点在于在循环中解决问题,不用定义数组,节省内存//本质思路一样
    else sum+=i;
    if(sum>max) max=sum;
    }
    printf("%d ",max);
    }
    }

  • 相关阅读:
    vim复制
    嵌入式Linux学习(二)
    (Java实现) 洛谷 P1042 乒乓球
    (Java实现) 洛谷 P1042 乒乓球
    (Java实现) 洛谷 P1071 潜伏者
    (Java实现) 洛谷 P1071 潜伏者
    (Java实现) 洛谷 P1025 数的划分
    (Java实现)洛谷 P1093 奖学金
    (Java实现)洛谷 P1093 奖学金
    Java实现 洛谷 P1064 金明的预算方案
  • 原文地址:https://www.cnblogs.com/wshyj/p/6254966.html
Copyright © 2011-2022 走看看