• 【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

  • 相关阅读:
    airflow 安装问题
    ACM-单词接龙
    ACM-AK吧!少年
    ACM-Alice and Bob
    ACM-Satellite Photographs
    ACM-Subset sum
    ACM-Special Array
    数据挖掘-回归分析
    数据库原理-数据库系统的结构
    数据库原理-几种数据模型
  • 原文地址:https://www.cnblogs.com/ChenMeng0518/p/5483858.html
Copyright © 2020-2023  润新知