zoukankan      html  css  js  c++  java
  • poj 2479 最大子数段

     由题意通过提示可以知道 这组数据最大子数段是可以相连着呢,所以可以从左往右搜一次,然后从右往左搜一次,最后取最大值

    比较注意

    #include<stdio.h>
    #include<string.h>

    int num[50010];
    int leftmax[50010];
    int rightmax[50010];
    int pre[50010];
    int max(int a,int b)
    {
    return a>b?a:b;
    }
    int main()
    {
    int T,n,zmax,l,r;
    scanf("%d",&T);
    while(T--)
    {
    memset(leftmax,0,sizeof(leftmax));
    memset(rightmax,0,sizeof(leftmax));
    memset(pre,0,sizeof(pre));
    memset(num,0,sizeof(num));
    int max_pre;
    max_pre = -20000;
    scanf("%d",&n);
    for(int i=0;i<n;i++)

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


    //从左往右搜


    leftmax[0] = num[0];
    for(int i=1;i< n;i++)
    {
    leftmax[i]=max(leftmax[i-1]+num[i],pre[i-1]+num[i] );
    pre[i-1] = max_pre;
    if(leftmax[i] > max_pre)
    max_pre = leftmax[i];
    l =leftmax[i];
    }
    pre[0] = num[0];
    pre[n-1] = l;
    for(int i=0;i<n;i++)
    {
    leftmax[i] = pre[i];

    }

    //从右往左搜



    max_pre = -20000;
    memset(pre,0,sizeof(pre));
    rightmax[n-1] = num[n-1];
    for(int i=n-2; i>=0;i--)
    {
    rightmax[i] = max(rightmax[i+1]+num[i],pre[i+1]+num[i]);
    pre[i+1] = max_pre;
    if(rightmax[i] > max_pre)
    max_pre = rightmax[i];
    r = rightmax[i];
    }
    pre[n-1] = num[n-1];
    pre[0] = r;
    for(int i=n-1;i>=0;i--)
    {
    rightmax[i] =pre[i];

    }

    //两次相加


    zmax = -20000;
    for(int i=0;i<n-1;i++ )
    {
    if(zmax < leftmax[i]+rightmax[i+1])
    zmax = leftmax[i]+rightmax[i+1];
    }

    printf("%d\n",zmax);
    }
    }

    的是别弄混了

  • 相关阅读:
    google 语音识别返回,
    如果到来,会是怎样情况,fuck,
    sql
    阅读《一》
    阅读,
    Codevs 1078 ==Poj 1258 Agri-Net
    洛谷 P3399 丝绸之路
    线段树-代码实现细节与技巧
    Codevs 1371 浴火银河跑运输
    POJ 3267 The Cow Lexicon
  • 原文地址:https://www.cnblogs.com/lfyy/p/2768846.html
Copyright © 2011-2022 走看看