算法第三章上机实践报告

实践题目

7-2 最大子段和

问题描述

给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],...,a[n],求该序列如a[i]+a[i+1]+...+a[j]的子段和的最大值。当所给的整数均为负数时,定义子段和为0
要求算法的时间复杂度为O(n)

算法描述

将每一个数是否列入当前子段作为一个决策,

1.如果加上这个数后子段和仍然大于0,那么加上这个数

2.如果加上这个数后子段和小于0,那么子段清零,下一个数作为新的子段的开始

在这个过程中记录遇到的最大子段和

算法时间及空间复杂度分析(要有分析过程)

该算法中只有一个 for循环语句,因此时间复杂度为O(n),满足题目要求。
空间复杂度为O(n)

心得体会(对本次实践收获及疑惑进行总结)

解决最大子段和问题,进一步加深对动态规划算法的理解与运用。

 

code:  
  

int MaxSum(int n, int *a) {
    int sum = 0, b = 0;

    for(int i =1; i <=n; i++) {
        if(b > 0) b += a[i];
        else b = a[i];

        if(b > sum) sum =b;
    }
    return sum;
}

int main() {
    int n;
    cin >>n;
    int a[n+1];
    
    bool resultOne = false;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
        if(a[i] > 0 ) resultOne = true;
    }
    
    int maxSum = 0;
    if(resultOne) maxSum = MaxSum(n, a);
    cout << maxSum;
}
posted @ 2019-10-21 14:09  AloneGhost  阅读(117)  评论(0编辑  收藏  举报