zoukankan      html  css  js  c++  java
  • 算法第三章上机实践报告

    1.实践题目

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

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

    2.问题描述

    题目要求时间复杂度为O(n),所以只能用一个for循环解决问题,要用到动态规划的算法。

    3.算法描述

     动态规划递归式为b[j]=max{b[j-1]+a[j],a[j]}(1<=j<=n)定义变量b作为一个动态的子段和,从第一个数开始到最后一个数。每循环判断下一个数,若大于0,最大子段和有可能包括它,则相加,若小于等于0,最大子段和不包括它。另外定义一个变量sum存储最大子段和,每次for循环最后判断当前子段和是否为当前最大子段和。这样动态存储就不用额外用一个数组b,使代码更加简洁。

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

    时间复杂度:只有一个for循环 故T(n)=O(n)

    空间复杂度:所需要的存储空间为与序列a[]等大 故S(n)=O(n)

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

    动态规划的代码很简短,效率很高。这需要我们在解决问题前很好的分析问题,尽可能的简化代码。一开始对b和sum起的作用不理解,后来在同伴的讲解下才明白。只有理解方法,才能用代码实现出来。结对编程帮助我更容易理解代码,学习同伴的长处,对自己的薄弱的编程能力也有所提高。

  • 相关阅读:
    P4097 [HEOI2013]Segment(李超线段树模板)
    P2155 [SDOI2008]沙拉公主的困惑
    BZOJ3675 [Apio2014]序列分割[斜率优化dp]
    hdu4261 Estimation[暴力dp+对顶堆]
    poj2374 Fence Obstacle Course[线段树+DP]
    poj1463 Strategic game[树形DP]
    CH5E02 [IOI1999]花店橱窗[暴力dp]
    CH5E01[NOIP2010] 乌龟棋[暴力]
    CH5702 Count The Repetitions[倍增dp]
    P1081 [NOIP2012]开车旅行[倍增]
  • 原文地址:https://www.cnblogs.com/yehaolin/p/11697202.html
Copyright © 2011-2022 走看看