码迷,mamicode.com
首页 > 编程语言 > 详细

算法第三章上机实践报告

时间:2018-11-11 13:52:49      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:++   nbsp   通过   class   cout   并且   tle   space   输入   

1.实践题目

7-2最大子段和 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时,定义子段和为0。

要求算法的时间复杂度为O(n)。

2.问题描述

输入格式:

输入有两行:

第一行是n值(1<=n<=10000);

第二行是n个整数。

输出格式:

输出最大子段和。

输入样例:

在这里给出一组输入。例如:

6
-2 11 -4 13 -5 -2

输出样例:

在这里给出相应的输出。例如:

20
#include <iostream>
using namespace std;
int n,a[10001];
int main(){
    cin >> n;
    for(int i=1;i<=n;i++){
        cin >> a[i];
    }
    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;
    }
    cout << sum;
    return 0;
    
}

 



3.算法描述

一番讨论过后,我们决定首先建立一个数组存放值,另外还设了b用于暂时存放最大子段和的值,并通过与最终值sum比较来确定最终最大子段和的值

代码如下:

for(int i =1;i <= n;i++){

if (b>0) b += a[i];
else b = a [i];
if (b>sum) sum = b;
}

 

4.算法时间及空间复杂度分析

时间复杂度:O(n)

空间复杂度:O(n)

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

本次实践我和我的队友彦君完成了两题,主要是在第一题花的时间比较多,期间我们讨论了很多,可能是当时对于动态规划的思想还掌握不够的原因,我们的进程要落后其他同学很多,不过最后我们还是解决了问题,彼此也收获了很多;
第二题的话由于本身题型比较简单,并且书上也相关的例子,所以我们没有花费太多的时间就解决了,但是由于我对题目的理解出现了偏差,导致不能够给予老师满意的回答,不过我最终还是在彦君的帮助下通过了,这让我对于动态规
划思想的理解更加深刻了。

算法第三章上机实践报告

标签:++   nbsp   通过   class   cout   并且   tle   space   输入   

原文地址:https://www.cnblogs.com/chanchanchan/p/9941867.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!