【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小计
2012295130030
2013289733538
2013290017.5522.5
2013290232.5537.5
2013290738240
2013291739.5241.5
2013292235.52.538
2013292726.5026.5
2013293533.5740.5
20132967286.534.5
2013297022.5325.5
20132984361.537.5
2013298533134
2013300529.52.532
2013300930.5535.5
2013301232.5032.5
2013301419019
2013301822022
2013303932537
2013304028129
2013304529938
2013304829.5130.5
2013305132.56.539
2013305433.56.540
2013305723.5023.5
2013305927027
2013306216.5016.5
2013306430.5030.5
2013307031031
2013307532032
2013307836844
20133081312.533.5
2013308730434
20133100365.541.5
2013289910313
2013290114.50.515
2013290331.5738.5
2013291037.5138.5
2013291239.52.542
20132919409.549.5
20132924419.550.5
2013295838442
2013295937.52.540
2013296534.55.540
2013297132.55.538
20132980351.536.5
2013300434034
2013300827.54.532
2013301011314
2013301327835
2013301727.5330.5
2013301935136
2013302433.5740.5
2013302733.5841.5
2013303123.5326.5
2013304222.54.527
20133043505
201330444.504.5
2013304716117
2013305627.50.528
2013305833.5437.5
2013306326.50.527
2013306621.5021.5
20133073238.531.5
2013307729.5534.5
2013307929.5837.5
2013308810.50.511
2013309325.5025.5
2013309921021
20133101335.538.5

其他问题

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

软件工程的意义

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

转载于:https://www.cnblogs.com/ChenMeng0518/p/5483858.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值