zoukankan      html  css  js  c++  java
  • 最大字段和 (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; 
    }
    

       

  • 相关阅读:
    boost 无锁队列
    boost::asio 的同、异步方式
    MFC获取当前时间
    利用boost获取时间并格式化
    VS2008找不到MFC90d.dll错误解决方法
    boost库在工作(39)网络UDP异步服务端之九
    boost::asio译文
    windows 和linux 同步api对比
    BOOST::Signals2
    redhat 各种版本下载
  • 原文地址:https://www.cnblogs.com/HpuAcmer/p/2264856.html
Copyright © 2011-2022 走看看