Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2091227
  • 博文数量: 413
  • 博客积分: 10926
  • 博客等级: 上将
  • 技术积分: 3862
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-09 18:14
文章分类

全部博文(413)

文章存档

2015年(5)

2014年(1)

2013年(5)

2012年(6)

2011年(138)

2010年(85)

2009年(42)

2008年(46)

2007年(26)

2006年(59)

分类: C/C++

2010-07-11 10:13:25


  1. 说明
    整个算法就像一个蠕虫,头部每次向前爬一格,如果总和大于0的话就一直爬;如果小于0,那把尾巴缩到头部,头部继续爬
    上述就是一个遍历的过程,现 在只要将这过程中的最大和记录下来就行了

    代码
    #include <stdio.h>

    void foo( int buf[], int n )
    {
        
    int a=0, b=0, sum=0// a为起始下标,b为连续长度,sum为和
        int a1=0, b1=0, sum1=0// 暂时的可能
        forint i=0; i<n; ++i )
        
    {
            sum1 
    += buf[i]; // 接纳此元素后的和
            if( sum1 > 0 ) // 只要大于零,将来总是有可能变得更大的。有 希望就要保留!
            {
                
    ++b1;
            }

            
    else // 负数将来也有可能变得更大呀?我靠,那我还不如直接从0开始
            {
                a1 
    = i+1;
                b1 
    = 0;
                sum1 
    = 0;
            }


            
    if( sum1 > sum ) // 如果“暂时的可能”最优,当然它就成“正式的”啦
            {
                a 
    = a1;
                b 
    = b1;
                sum 
    = sum1;
            }

        }


        
    if( b != 0 )
            printf( 
    "Sum(%d,%d)=%d ", a, a+b-1, sum );
        
    else
            printf( 
    "%s ""全 TMD没个正数,当然是零个连续和最大呀!" );
    }


    int main()
    {
        
    int buf[] = 2,3,-6,3,4,3,-2,5,2,-3 }// Sum(3,8)=15
        foo( buf, sizeof(buf)/sizeof(buf[0]) );

        
    return 0;
    }


    (From: http://blog.vckbase.com/bruceteen/articles/25581.html#50277)
  2. xxx

阅读(1607) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~