算法第二章上机实践报告

  1. 实践题目名称: 最大子列和问题
  2. 问题描述:

    给定K个整数组成的序列{ N1​​, N2​​, ..., NK​​ },“连续子列”被定义为{ Ni​​, Ni+1​​, ..., Nj​​ },其中 1。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。

    本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下:

    • 数据1:与样例等价,测试基本正确性;
    • 数据2:102个随机整数;
    • 数据3:103个随机整数;
    • 数据4:104个随机整数;
    • 数据5:105个随机整数;
  3. 算法描述:通过递归把1个问题分为3个小问题。把序列分为2段(左边和右边),分别求左边和右边的最大连续子列和,和中间子列和,通过比较大小得出最大子列和。代码如下:
     1 #include<iostream>
     2  using namespace std;
     3  int maxsum(int a[],int l,int r){
     4      
     5      if(l==r){
     6          if(a[l]>0) return a[l];
     7          return 0;
     8      } 
     9      int m=(l+r)/2;
    10      
    11      //左边 
    12      int lmax=0;
    13      int lsum=0;
    14      for(int i= m;i>=l;i--){
    15          lsum +=a[i];
    16          if(lsum>lmax){
    17              lmax=lsum;
    18          }
    19      }
    20     //右边 
    21      int rmax=0;
    22      int rsum=0;     
    23      for(int i=m+1;i<=r;i++){
    24          rsum+=a[i];
    25          if(rsum>rmax){
    26              rmax=rsum;
    27          }
    28          
    29      }
    30      
    31      
    32      int sum1=maxsum(a,l,m);
    33      int sum2=maxsum(a,m+1,r);
    34      
    35     int sum3=lmax+rmax;
    36     if(sum3<lmax)
    37       sum3=lmax;
    38     if(sum3<rmax)
    39        sum3=rmax;
    40     int max=lmax>rmax?lmax:rmax;
    41     int ans=sum3>max?sum3:max;
    42     return ans;
    43      
    44  }
    45  int main(){
    46      int n,a[100000];
    47      cin>>n;
    48      for(int i=0;i<n;i++){
    49          cin>>a[i];
    50      }
    51      int ans=maxsum(a,0,n-1);
    52      cout<<ans;

     

  4. 算法时间及空间复杂度分析(要有分析过程):【时间复杂度】:2个子问题、循环n次 =》n/2次  = 2T(n/2)所以T(n)=2T(n/2)+O(n) =》nlogn 【空间复杂度】:n个数,需要n个位置
  5. 心得体会(对本次实践收获及疑惑进行总结):起初代码运行一直跳不出循环,后来发现是找中间点那里数据有错误,做完这次实践,我真的觉得如何让代码避免死循环是个很重要的问题。

posted on 2020-10-03 20:42  ouyuanyu  阅读(114)  评论(0编辑  收藏  举报

导航