• 最大字段和 (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; 
    }
    

       

  • 相关阅读:
    专职DBA-MySQL主从延时复制
    专职DBA-MySQL主从异步复制
    专职DBA-MySQL连接启动与多实例数据库
    Java日期时间2
    Java日期时间
    763. Partition Labels
    377. Combination Sum IV
    459. Repeated Substring Pattern
    784. Letter Case Permutation
    526. Beautiful Arrangement
  • 原文地址:https://www.cnblogs.com/HpuAcmer/p/2264856.html
Copyright © 2020-2023  润新知