zoukankan      html  css  js  c++  java
  • 动态规划 三.最大子段和

    例如,当a={-2,11,-4,13,-5,-2}时,最大子段和是20。

     1 #include<iostream>
     2 using namespace std;
     3 
     4 #define N 100
     5 
     6 int maxsum1(int *a,int n)//动态规划算法 
     7 {
     8     int sum=0,b=0;
     9     for(int i=1;i<=n;i++)
    10     {
    11         if(b>0)b+=a[i];
    12         else b=a[i];
    13         if(b>sum)sum=b;
    14      } 
    15      return sum;
    16 } 
    17 
    18 int maxsubsum(int *a,int left,int right)
    19 {
    20     int sum=0;
    21     if(left==right) sum=a[left]>0?a[left]:0;
    22     else 
    23     {
    24         int center=(left+right)/2;
    25         int leftsum=maxsubsum(a,left,center);
    26         int rightsum=maxsubsum(a,center+1,right);
    27         int s1=0;
    28         int lefts=0;
    29         for(int i=center;i>=left;i--)
    30         {
    31             lefts+=a[i];
    32             if(lefts>s1)s1=lefts;
    33         }
    34         int s2=0;
    35         int rights=0;
    36         for(int i=center+1;i<=right;i++)
    37         {
    38             rights+=a[i];
    39             if(rights>s2)s2=rights;
    40         }
    41         sum=s1+s2;
    42         if(sum<leftsum)sum=leftsum;
    43         if(sum<rightsum)sum=rightsum;
    44     }
    45     return sum;
    46 }
    47 
    48 int maxsum(int *a,int n)//分治算法 
    49 {
    50     return maxsubsum(a,1,n); 
    51 }
    52 
    53 
    54 int main()
    55 {
    56     int a[N],n;
    57     cin>>n;
    58     for(int i=1;i<=n;i++)
    59     cin>>a[i];
    60     cout<<"分治算法:" <<maxsum(a,n)<<endl; 
    61     cout<<"动态规划算法:" <<maxsum1(a,n)<<endl;
    62     return 0;
    63 }
  • 相关阅读:
    转载:通过Servlet生成验证码
    转载:web工程中URL地址的推荐写法
    使用Git上传本地项目代码到github
    $watch 和 $apply
    平时用的sublime插件
    zTree.js
    js
    npm install详解
    git
    git基础
  • 原文地址:https://www.cnblogs.com/yuanqingwen/p/12753801.html
Copyright © 2011-2022 走看看