此篇講的是截止時間至 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 | 32.5 | |
20132907 | 8 | 38 | |
20132917 | 32 | 7.5 | 39.5 |
20132922 | 28 | 35.5 | |
20132927 | 20.5 | 6 | 26.5 |
20132935 | 24.5 | 33.5 | |
20132967 | 20 | ||
20132970 | 22.5 | ||
20132984 | 29 | 36 | |
20132985 | 27.5 | 5.5 | |
20133005 | 5 | 29.5 | |
20133009 | 25 | 30.5 | |
20133012 | |||
20133014 | 14 | 19 | |
20133018 | 3 | 22 | |
20133039 | 2.5 | ||
20133040 | 1.5 | ||
20133045 | 21 | ||
20133048 | |||
20133051 | |||
20133054 | 31 | ||
20133057 | 23.5 | ||
20133059 | 19.5 | 27 | |
20133062 | 12 | 4.5 | 16.5 |
20133064 | |||
20133070 | |||
20133075 | |||
20133078 | |||
20133081 | |||
20133087 | |||
20133100 | |||
20132899 | 3.5 | 10 | |
20132901 | 14.5 | ||
20132903 | 31.5 | ||
20132910 | 28.5 | 37.5 | |
20132912 | |||
20132919 | 40 | ||
20132924 | 41 | ||
20132958 | |||
20132959 | |||
20132965 | 34.5 | ||
20132971 | |||
20132980 | 35 | ||
20133004 | 34 | ||
20133008 | |||
20133010 | 8.5 | ||
20133013 | |||
20133017 | |||
20133019 | |||
20133024 | 9.5 | ||
20133027 | |||
20133031 | 18 | ||
20133042 | |||
20133043 | |||
20133044 | |||
20133047 | 15 | 1 | 16 |
20133056 | |||
20133058 | 25.5 | ||
20133063 | |||
20133066 | 21.5 | ||
20133073 | |||
20133077 | |||
20133079 | |||
20133088 | 10.5 | ||
20133093 | 4 | ||
20133099 | 17 | ||
20133101 |
其他問題
如果有同學認為自己的作業,評分與預期有差;或者有新的補充。
那麼建議你通過部落格園站内短消息的方式聯系我,或者在你的作業後回帖留言(記得 @ 我)。
你也可以在這篇博文下直接回複。不過不推薦你這樣做……
軟體工程的意義
歡迎參看下面的文章:
http://www.cnblogs.com/ChenMeng0518/p/5460435.html