zoukankan      html  css  js  c++  java
  • poj 2479

    题目:找到一个序列中的两个连续段使得他们的和最大。

    分析:dp,最大字段和。双向求最大字段和。枚举结束点找到加和最大值。

    说明:与合唱队形类似。(同poj2593)(2011-09-24 02:09)

    #include <stdio.h>
    #include <stdlib.h>
    
    int data[ 50005 ];
    int asum[ 50005 ];
    int bsum[ 50005 ];
    
    void msum( int *D,int *A, int a, int b, int s )
    {
        int sum = 0;
        for ( int i = a ; i != b ; i += s ) {
            if ( sum < 0 ) sum = 0;
            sum += D[ i ];
            A[ i ] = sum;
        }
        int max = A[ a ];
        for ( int i = a+s ; i != b ; i += s )
            if ( max < A[ i ] ) max = A[ i ];
            else A[ i ] = max;
    }
    
    int main()
    {
        int t,n;
        while ( scanf("%d",&t) != EOF ) 
        while ( t -- ) {
            scanf("%d",&n);
            for ( int i = 1 ; i <= n ; ++ i )
                scanf("%d",&data[ i ]);
                
            msum( data, asum, 1, n, +1 );
            msum( data, bsum, n, 1, -1 );
    
            int    max = -20000;
            for ( int i = 1 ; i <  n ; ++ i )
                if ( max < asum[ i ] + bsum[ i+1 ] )
                    max = asum[ i ] + bsum[ i+1 ];
            
            printf("%d
    ",max);
        }
        return 0;
    }
     

  • 相关阅读:
    7、对齐工具
    6、复制命令
    5、木地板制作
    4、创建扩展基本体
    3、创建标准基本体
    2、标准基本体
    1、视图导航和显示控制
    2、如何复印双面都有文字的纸张?
    让人误解的英语俚语
    MATLAB PDE工具箱简单教程
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5193303.html
Copyright © 2011-2022 走看看