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起的作用不理解,后来在同伴的讲解下才明白。只有理解方法,才能用代码实现出来。结对编程帮助我更容易理解代码,学习同伴的长处,对自己的薄弱的编程能力也有所提高。

  • 相关阅读:
    linux中压缩、解压缩命令
    linux中的sed指令
    linux中shell编程(一)
    linux中的正则表达式
    linux中的管道和重定向
    linux中用户、组和权限相关指令
    linux中bash常见的指令
    linux文本操作相关指令
    java.lang.OutOfMemoryError 解决程序启动内存溢出问题
    Java常用排序算法/程序员必须掌握的8大排序算法
  • 原文地址:https://www.cnblogs.com/yehaolin/p/11697202.html
Copyright © 2011-2022 走看看