1. 程式人生 > 其它 >hdu1024 max sum plus plus + 最大子段和

hdu1024 max sum plus plus + 最大子段和

網上一水的dp加各種優化。

我想起那道最大欄位和,做法與其說是dp不如更像是貪心。

證明一下:

假設當前走到了ai,發現開始有了若干負數

要不要過去呢?先讓子彈飛一會。

截止現在我們有三種選擇,第一止步,第二帶著現在的maxn走過去,第三跳過去從接下來一段正的開始重新計數。

這三種選擇可以用以下兩種情況囊括:

第一種可能是在走過的路上死了,那就繼續判斷:新的一段開始和預備答案的關係。

第二種可能是走過了還有一些血,那可以繼續累加正數,(並且這個答案肯定比“第三跳過去從接下來一段正的開始重新計數”來的好。)再和預備答案比,繼續執行。

就蠻走看看會是那種情況..

那麼再回來看這道題,為何不在每次有某個答案被淘汰掉時,把它扔到一個容器裡呢?

我們的貪心做法保證了這些答案不會相交(模擬唄);

如何保證m?分兩種情況

如果這樣貪心完一遍後被我們選取的區間長度大於m,那就可以直接輸出了,因為如果少了的話,可以割幾個元素個數為1的出來湊齊m段。

如果選取的區間長度小於m,每次扔進容器裡要記錄這段的開頭和結尾,最後在O(n)一遍,把沒有選到的拎出來,選擇最大的加。

這個做法(還未檢驗正確性與否..邏輯上感覺沒毛病,程式碼上,就是因為對程式碼能力自閉我才來寫bloghh)

#可以應付很大的資料,相比之下,原題連m的範圍都沒給,看了半天愣是不敢dp

#沒那麼好寫