【160326 24:00】最大子序列之和 2
此篇讲的是截止时间至 3 月 26 日 24:00 的最大子序列之和 2。相应的题目,可以见王建民老师的博客中第 2 题:
http://www.cnblogs.com/wangjm1975/p/5411663.html
问题简析
这是一个最优化问题,在上一题 DP 的思想下,我们容易想到平凡的 \(O(n^2)\) 的解法。不过,本题也有 \(O(n)\) 的解法,参考:
class SubArraySumResult:
def __init__ (self, value, begin, end):
self.value = value
self.begin = begin
self.end = end
def __str__ (self):
return "(%d, %d, %d)" % (self.value, self.begin, self.end)
def kadane (nums):
if not nums:
return None
elif 1 == len (nums):
return SubArraySumResult (nums[0], 0, 1)
local_max = SubArraySumResult (nums[0], 0, 1)
global_max = SubArraySumResult (nums[0], 0, 1)
for i in xrange (1, len (nums)):
if local_max.value > 0:
local_max.value += nums[i]
local_max.end = i + 1
else:
local_max.value = nums[i]
local_max.begin = i
local_max.end = i + 1
if local_max.value > global_max.value:
global_max = SubArraySumResult \
(local_max.value, local_max.begin, local_max.end)
return global_max
def maxCircularSum (nums):
if not nums:
return None
elif 1 == len (nums):
return SubArraySumResult (nums[0], 0, 1)
max_kadane = kadane (nums)
if max_kadane.value <= 0:
return max_kadane
max_wrap = sum (nums)
nums = [-x for x in nums]
inverse_kadane = kadane (nums)
max_wrap += inverse_kadane.value
if max_wrap > max_kadane.value:
return SubArraySumResult \
(max_wrap, inverse_kadane.end - len (nums), inverse_kadane.begin)
else:
return max_kadane
if __name__ == '__main__':
test_cases = [[], [0], [0, 0, 0], [1, 1, 1], [1, 2, 3], [-2, -1, -3],
[11, 10, -20, 5, -3, -5, 8, -13, 10],
[11, 10, -20, 5, -3, -5, 8, -13, 10, 11, 10, -20, 5, -3, -5, 8, -13, 10]]
for nums in test_cases:
print "The maxCircularSum of", nums, "is", maxCircularSum (nums)
评分标准
这次作业满分 10 分,采取扣分制与体验分相结合的方式。具体来说:
- 每见到一处问题/缺陷,扣除该类问题/缺陷相应的分数;
- 在保证正确的前提下代码使用的算法能够在 \(O(n)\) 时间内解决问题,加 1 分;
- 与此同时,还会有 \(\pm 1\) 分的体验分浮动:博文结构清晰、排版整洁、代码清爽等情况酌情加分,反之扣分。
10 分
- 作业迟交超过 24 小时
- 未能完成任务
5 分
- 没有提交代码(至少核心代码)
- 程序给出错误结果
2 分
- 作业迟交,但未超过 24 小时
- 博文代码没有使用「代码模式」编辑(这很重要,已经是第六次作业了,因此提升权重,望引起重视)
- 博文中,非代码内容使用了「代码模式」编辑(这很重要,已经是第六次作业了,因此提升权重,望引起重视)
- 程序没有给出子序列的位置,或给出来错误的位置
1 分
- 没有阐述设计思想
- 没有运行结果截图
- 没有代码复审或测试,或有复审和测试但仍有明显漏洞
- 没有总结分析;或总结中没有实际内容:对本次编程的分析或遇到的问题和解决方法
每项 0.5 -- 2 分
- 额外的问题
- Cpp 编程,忽略
namespace
- Cpp 编程,使用
void main ()
而不是int main ()
- Cpp 编程,标准库头文件都没有
.h
结尾 - 限死了读入数据的上限,如果输入的数组长度超出上限,则程序无法正常运行或无法给出正确结果
- 类似
max
这类函数,标准库里已有,不要重复造轮子 - 不恰当的循环变量,可能引起数组越界,引发 core dump
- 当输入的数组全为负数时,无法得到正确的结果
new
了没有delete
或者malloc
了没有free
- Cpp 编程,忽略
评分结果
学号 | 截至上次作业得分小计 | 160326 24:00 | 小计 |
---|---|---|---|
20122951 | 30 | 0 | 30 |
20132897 | 33 | 5 | 38 |
20132900 | 17.5 | 5 | 22.5 |
20132902 | 32.5 | 5 | 37.5 |
20132907 | 38 | 2 | 40 |
20132917 | 39.5 | 2 | 41.5 |
20132922 | 35.5 | 2.5 | 38 |
20132927 | 26.5 | 0 | 26.5 |
20132935 | 33.5 | 7 | 40.5 |
20132967 | 28 | 6.5 | 34.5 |
20132970 | 22.5 | 3 | 25.5 |
20132984 | 36 | 1.5 | 37.5 |
20132985 | 33 | 1 | 34 |
20133005 | 29.5 | 2.5 | 32 |
20133009 | 30.5 | 5 | 35.5 |
20133012 | 32.5 | 0 | 32.5 |
20133014 | 19 | 0 | 19 |
20133018 | 22 | 0 | 22 |
20133039 | 32 | 5 | 37 |
20133040 | 28 | 1 | 29 |
20133045 | 29 | 9 | 38 |
20133048 | 29.5 | 1 | 30.5 |
20133051 | 32.5 | 6.5 | 39 |
20133054 | 33.5 | 6.5 | 40 |
20133057 | 23.5 | 0 | 23.5 |
20133059 | 27 | 0 | 27 |
20133062 | 16.5 | 0 | 16.5 |
20133064 | 30.5 | 0 | 30.5 |
20133070 | 31 | 0 | 31 |
20133075 | 32 | 0 | 32 |
20133078 | 36 | 8 | 44 |
20133081 | 31 | 2.5 | 33.5 |
20133087 | 30 | 4 | 34 |
20133100 | 36 | 5.5 | 41.5 |
20132899 | 10 | 3 | 13 |
20132901 | 14.5 | 0.5 | 15 |
20132903 | 31.5 | 7 | 38.5 |
20132910 | 37.5 | 1 | 38.5 |
20132912 | 39.5 | 2.5 | 42 |
20132919 | 40 | 9.5 | 49.5 |
20132924 | 41 | 9.5 | 50.5 |
20132958 | 38 | 4 | 42 |
20132959 | 37.5 | 2.5 | 40 |
20132965 | 34.5 | 5.5 | 40 |
20132971 | 32.5 | 5.5 | 38 |
20132980 | 35 | 1.5 | 36.5 |
20133004 | 34 | 0 | 34 |
20133008 | 27.5 | 4.5 | 32 |
20133010 | 11 | 3 | 14 |
20133013 | 27 | 8 | 35 |
20133017 | 27.5 | 3 | 30.5 |
20133019 | 35 | 1 | 36 |
20133024 | 33.5 | 7 | 40.5 |
20133027 | 33.5 | 8 | 41.5 |
20133031 | 23.5 | 3 | 26.5 |
20133042 | 22.5 | 4.5 | 27 |
20133043 | 5 | 0 | 5 |
20133044 | 4.5 | 0 | 4.5 |
20133047 | 16 | 1 | 17 |
20133056 | 27.5 | 0.5 | 28 |
20133058 | 33.5 | 4 | 37.5 |
20133063 | 26.5 | 0.5 | 27 |
20133066 | 21.5 | 0 | 21.5 |
20133073 | 23 | 8.5 | 31.5 |
20133077 | 29.5 | 5 | 34.5 |
20133079 | 29.5 | 8 | 37.5 |
20133088 | 10.5 | 0.5 | 11 |
20133093 | 25.5 | 0 | 25.5 |
20133099 | 21 | 0 | 21 |
20133101 | 33 | 5.5 | 38.5 |
其他问题
如果有同学认为自己的作业,评分与预期有差;或者有新的补充。
那么建议你通过博客园站内短消息的方式联系我,或者在你的作业后回帖留言(记得 @ 我)。
你也可以在这篇博文下直接回复。不过不推荐你这样做……
软件工程的意义
欢迎参看下面的文章:
http://www.cnblogs.com/ChenMeng0518/p/5460435.html