最大字段和 (DP)

        题目略。能看到这篇文章的肯定知道题目。

        核心代码就3句,但是涉及的思想需要弄清楚。我都写在代码中的注释了。

 

CODE:

#include<stdio.h>
int a[1000001];

int maxsum(int x[],int n);
int main()
{
  int T,n,i;
  scanf("%d",&T);
      
      do
      {
         scanf("%d",&n);
         for(i = 0 ; i < n ; ++i)
          scanf("%d",&a[i]);  
         printf("%d\n",maxsum(a,n));
                 
      }while(--T);
      
 // system("pause");
  return 0;    
}

int maxsum(int x[],int n)
{
   int i,b = 0,k = -10000000;

   for(i = 0 ; i < n ; ++i)
   {
       if(b > 0) b += x[i];//如果累加和是正数,则继续加 
       /* 
          如果b <= 0,那么一定有x[i-1]<0,x[i]待定,那么如果x[i]>= 0时,
          b=x[i]是理所当然的;如果x[i]<0呢?b=x[i]合适吗?答案是合适。
          因为下一次循环b依然小于0,肯定可以找到一个大于0的数    
          
          还有一个问题:b = x[i],那不就想当然把刚才那个字段全部舍弃了吗?
          如果刚才那个子段的子段(前几个为负数)大于0呢?但这是不可能的。
          因为一个字段的第一个数一定是个正数,因为如果第一个数是负数,
          那么b<0,会执行else,直到有个正数出现,才会开始一个子段的累加 
       */
        
       else  b = x[i];//如果累加和是负数了,就把这个值赋值给b  
            
       if(b > k) k = b;//更新最大字段和 
   }
       
   return k; 
}

 

   

posted @ 2011-11-27 10:10  开开甲  阅读(651)  评论(0编辑  收藏  举报