【160326 18:00】最大子序列之和 1

此篇讲的是截止时间至 3 月 26 日 18:00 的最大子序列之和 1 之小结。相应的题目,可以见王建民老师的博客中第一题:

http://www.cnblogs.com/wangjm1975/p/5411663.html

问题简析

这是一个最优化问题,并且要求时间复杂度为 \(O(n)\)。这样一来,首先想到的应该是动态规划思想。

动态规划是求解最优化问题的一种思想。

动态规划的核心,是要寻找一种看待问题的方式:这种角度以某种方式将原问题划分为有限的若干阶段;每个阶段可以有若干状态,但只有一个最优状态;当前阶段的最优状态,可以用某种确定的方式,从过去某些阶段的某些状态直接得到;这种方式,只与这些阶段的状态有关,而与这些状态是如何得到的无关。这样一来,如果我们能够在某个阶段找到确定的最优状态,就能够逐层递推,找到原问题的最优解。

在这里:

  • 有限的阶段,即是子问题;
  • 当前阶段的最优状态,即是局部最优解;
  • 当前阶段的最优状态,可以用某种确定的方式,从过去某些阶段的某些状态直接得到,即是最优子结构性质;
  • 这种方式,只与这些阶段的状态有关,而与这些状态是如何得到的无关,即是无后效性质。

也就是说,动态规划的核心,是要寻找一种具有最优子结构的无后效的问题拆解方式。

以下是用 Python 简写的本题参考:

def maxSubArraySum (nums):
    if not nums:
        return None
    elif 1 == len (nums):
        return nums[0]

    local_max, global_max = nums[0], nums[0]

    for i in xrange (1, len (nums)):
        local_max  = max (local_max + nums[i], nums[i])
        global_max = max (local_max, global_max)

    return global_max

if __name__ == '__main__':
    test_cases = [[], [0], [1], [1, 2, 3], [-3, -1, -2],
                  [9, 8, 5, 2, -5, 6, 2, -2]]
    for nums in test_cases:
        print "The maxSubArraySum of", nums, "is", maxSubArraySum (nums)

评分标准

这次作业满分 10 分,采取扣分制与体验分相结合的方式。具体来说:

  • 每见到一处问题/缺陷,扣除该类问题/缺陷相应的分数;
  • 与此同时,还会有 \(\pm 1\) 分的体验分浮动:博文结构清晰、排版整洁、代码清爽等情况酌情加分,反之扣分。

10 分

  • 作业迟交超过 24 小时
  • 未能完成任务

5 分

  • 没有提交代码(至少核心代码)

2 分

  • 作业迟交,但未超过 24 小时
  • 博文代码没有使用「代码模式」编辑(这很重要,已经是第五次作业了,因此提升权重,望引起重视)
  • 博文中,非代码内容使用了「代码模式」编辑(这很重要,已经是第五次作业了,因此提升权重,望引起重视)
  • 程序没有正确计算最大子数组的和
  • 算法的时间复杂度超过 \(O(n)\)

1.5 分

  • 没有阐述设计思想
  • 没有总结分析;或总结中没有实际内容:对本次编程的分析或遇到的问题和解决方法

1 分

  • 没有运行结果截图
  • 输出错误的结果
  • 没有对平凡(trivial)的情况进行处理:如果输入数组为空怎么办?

每项 1 -- 3 分

  • 额外的问题(见博文后的回复说明)

评分结果

学号 截至上次作业得分小计 160326 18:00 小计
20122951 23 7 30
20132897 24 9 33
20132900 11 6.5 17.5
20132902 26 6.5 32.5
20132907 30 8 38
20132917 32 7.5 39.5
20132922 28 7.5 35.5
20132927 20.5 6 26.5
20132935 24.5 9 33.5
20132967 20 8 28
20132970 22.5 0 22.5
20132984 29 7 36
20132985 27.5 5.5 33
20133005 24.5 5 29.5
20133009 25 5.5 30.5
20133012 27.5 5 32.5
20133014 14 5 19
20133018 19 3 22
20133039 29.5 2.5 32
20133040 26.5 1.5 28
20133045 21 8 29
20133048 28 1.5 29.5
20133051 24.5 8 32.5
20133054 31 2.5 33.5
20133057 17.5 6 23.5
20133059 19.5 7.5 27
20133062 12 4.5 16.5
20133064 24.5 6 30.5
20133070 25 6 31
20133075 26 6 32
20133078 29 7 36
20133081 24.5 6.5 31
20133087 24.5 5.5 30
20133100 28 8 36
20132899 6.5 3.5 10
20132901 9 5.5 14.5
20132903 22.5 9 31.5
20132910 28.5 9 37.5
20132912 32 7.5 39.5
20132919 31 9 40
20132924 32 9 41
20132958 30 8 38
20132959 30 7.5 37.5
20132965 28 6.5 34.5
20132971 26 6.5 32.5
20132980 28 7 35
20133004 28.5 5.5 34
20133008 22.5 5 27.5
20133010 8.5 2.5 11
20133013 19 8 27
20133017 21 6.5 27.5
20133019 29 6 35
20133024 24 9.5 33.5
20133027 24 9.5 33.5
20133031 18 5.5 23.5
20133042 17.5 5 22.5
20133043 5 0 5
20133044 4.5 0 4.5
20133047 15 1 16
20133056 24 3.5 27.5
20133058 25.5 8 33.5
20133063 21 5.5 26.5
20133066 21.5 0 21.5
20133073 14.5 8.5 23
20133077 24 5.5 29.5
20133079 24 5.5 29.5
20133088 10.5 0 10.5
20133093 21.5 4 25.5
20133099 17 4 21
20133101 25 8 33

其他问题

如果有同学认为自己的作业,评分与预期有差;或者有新的补充。
那么建议你通过博客园站内短消息的方式联系我,或者在你的作业后回帖留言(记得 @ 我)。
你也可以在这篇博文下直接回复。不过不推荐你这样做……

软件工程的意义

欢迎参看下面的文章:
http://www.cnblogs.com/ChenMeng0518/p/5460435.html

posted @ 2016-05-11 22:24  孟晨  阅读(216)  评论(0编辑  收藏  举报