算法第三章上机实践

1.实践题目

最大子段和 

2.问题描述

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

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

输入格式:

输入有两行:

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

第二行是n个整数。

输出格式:

输出最大子段和。

3.算法描述

int maxsum(int a[],int n)
{
    int sum=0,k=0;
    for(int i=0;i<n;i++)
    {
        if(k>0) k+=a[i];
        else k=a[i];
        if(k>sum)sum=k;
    }

通过对当前子段和与以存的比较,不断更新最大子段和。

4.算法的时间及空间复杂度

时间复杂度为O(n)因为只用了单独的for循环的动态规划求解子段和。

空间复杂度为O(n)因为除了输入开的大小为n的数组,没有开更大的空间,只有几个存储结果的变量。

5.心得体会

动态规划的学习与解答问题比较难思考,但是对编程的复杂度大大减少,使代码更精简,思路更清晰。另外,对于问题不能一味蛮干,需要和自己的队友一起思考,讨论,往往能得出更加合适的答案,感受到合作的魅力。

posted on 2018-11-02 11:58 ydqbala 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/ydqbala/p/9895504.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值