zoukankan      html  css  js  c++  java
  • 【C++】最大子列和

      此题来自《数据结构与算法》,书中一共介绍了四种方法,这里贴出两种。

    1.分治递归,对本题来说,虽然有更好的算法,但是用此题理解分治算法感觉挺有用

     1 #include <iostream>
     2 int maxsublink(int *a,int right,int left);
     3 using std::cout;
     4 using std::cin;
     5 
     6 int main()
     7 {
     8     int a[8]={4,-3,5,-2,-1,2,6,-2};
     9     int maxnum=maxsublink(a,0,7);
    10     cout<<maxnum;
    11     return 0;
    12 }
    13 int maxsublink(int *a,int left,int right)
    14 {
    15     int rightmax,leftmax;
    16     int leftbordermax,rightbordermax;
    17     int leftborder,rightborder;
    18 
    19     if(left==right)
    20       {
    21           if(a[left]>0)
    22             return a[left];
    23         else
    24             return 0;
    25       }
    26     int mid,i;
    27     mid=(right+left)/2;
    28     leftmax=maxsublink(a,left,mid);
    29     rightmax=maxsublink(a,mid+1,right);
    30     leftborder=leftbordermax=0;
    31     for(i=mid;i>=left;i--)
    32     {
    33         leftborder+=a[i];
    34         if(leftborder>leftbordermax)
    35             leftbordermax=leftborder;
    36     }
    37     rightborder=rightbordermax=0;
    38     for(i=mid+1;i<=right;i++)
    39     {
    40         rightborder+=a[i];
    41         if(rightborder>rightbordermax)
    42             rightbordermax=rightborder;
    43     }
    44     int intermax=leftbordermax+rightbordermax;
    45     if(intermax>=rightmax)
    46     {
    47         if(intermax>=leftmax)
    48             return intermax;
    49         else
    50             return leftmax;
    51     }
    52     else
    53     {
    54         if(rightmax>=leftmax)
    55             return rightmax;
    56         else
    57             return leftmax;
    58     }
    59 }

    2.遍历整个数组,每个遍历的值保存入thissum,当thissum<0时,thissum置零;当thissum>max时,更新max

     这种方法时间复杂度可以达到O(n),感觉这种编程方法很值得学习,而且在别的算法中也经常用到,很典型。

     1 #include <iostream>
     2 
     3 using namespace std;
     4 int maxsublink(int *a,int num);
     5 int main()
     6 {
     7     int a[8]={4,-3,5,-2,-1,2,6,-2};
     8     int maxnum=maxsublink(a,8);
     9     cout<<maxnum;
    10     return 0;
    11 }
    12 int maxsublink(int *a,int num)
    13 {
    14     int i,thissum,maxsum;
    15     maxsum=thissum=0;
    16     for(i=0;i<num;i++)
    17     {
    18         thissum+=a[i];
    19         if(thissum>maxsum)
    20             maxsum=thissum;
    21         else if(thissum<0)
    22             thissum=0;
    23     }
    24     return maxsum;
    25 }
  • 相关阅读:
    web开发之web 验证码--- webqq 机器人
    赛星软件---智能视频分析事件检测
    模式识别之双目立体视觉---双目立体视觉相关介绍
    安卓项目之微信公众好---初体验
    《数学分析》视频
    单目和双目模式识别---游戏控制
    多媒体开发之音频编码---ffmpeg 编码aac
    PC如何访问手机网址
    linux shell实现守护进程 看门狗 脚本
    grep用法详解:grep与正则表达式
  • 原文地址:https://www.cnblogs.com/fcyworld/p/6166480.html
Copyright © 2011-2022 走看看