【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

评分结果

学号 截至上次作业得分小计 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

posted @ 2016-05-14 23:39  孟晨  阅读(297)  评论(0编辑  收藏  举报