【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