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

    1.实践题目

    7-2 最大子段和 (40 分)

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

    2.问题描述

    题目求的是最大字段和,且要求时间复杂度为O(n),应运用动态规划法将之前的运算结果存下,从而降低时间复杂度。

    3.算法描述

    运用动态规划的精髓是写出其动态规划递归式,temp[i]=max{b[i-1]+a[i],a[i]} (1<=i<=n),其中temp的作用是记录当前的和,若比当前的sum大则记录到sum中,最后输出的sum便是最大值。

    int MaxSum(int n, int a[]) {
             int sum = 0, temp = 0;
             for (int i = 1; i <= n; i++) 
          {
                  if (temp > 0)
                      temp += a[i];
                 else
                     temp = a[i];
                 if (temp > sum)
                    sum = temp;
           }
            return sum;
                                            }  

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

    时间复杂度:算法中只有一个for循环,因此为O(n)

    空间复杂度:算法中用到了一个和原序列等大的辅助空间,因此为O(n)

    5.心得体会

    这次的第三章上机实践一共做了两道题目,而我选择的是第二题关于最大字段和的题目,题目选用动态规划的想法来提高效率,最重要是先把递归方程式写出来,然后按照这个方程式写出算法,

    动态规划法一般要用到辅助数组(空间),能降低时间复杂度,提升算法效率。

  • 相关阅读:
    BZOJ 4815: [Cqoi2017]小Q的表格
    BZOJ 3676: [Apio2014]回文串
    BZOJ 4503: 两个串
    BZOJ 2618: [Cqoi2006]凸多边形
    BZOJ 1137: [POI2009]Wsp 岛屿
    BZOJ 4824: [Cqoi2017]老C的键盘
    BZOJ 3167: [Heoi2013]Sao
    BZOJ 4033: [HAOI2015]树上染色
    1003. 我要通过!(20)
    1002. 写出这个数 (20)
  • 原文地址:https://www.cnblogs.com/fengwanthousand/p/11715789.html
Copyright © 2011-2022 走看看