描述 Description
烽火臺又稱烽燧,是重要的防御設施,一般建在險要處或交通要道上。一旦有敵情發生,白天燃燒柴草,通過濃煙表達信息:夜晚燃燒干柴,以火光傳遞軍情。在某兩座城市之間有n個烽火臺,每個烽火臺發出信號都有一定的代價。為了使情報準確的傳遞,在m個烽火臺中至少要有一個發出信號。現輸入n、m和每個烽火臺發出的信號的代價,請計算總共最少需要花費多少代價,才能使敵軍來襲之時,情報能在這兩座城市之間準確的傳遞?。。?/p>
輸入格式 Input Format
第一行有兩個數n,m分別表示n個烽火臺,在m個烽火臺中至少要有一個發出信號。
第二行為n個數,表示每一個烽火臺的代價。
輸出格式 Output Format
一個數,即最小代價。
樣例
5 3
1 2 5 6 2
4
時間限制 Time Limitation
各個測試點1s
注釋 Hint
1<=n,m<=1,000,000
分析
要用動態規劃的方法解決。我們可以寫出這樣的方程f[i]:=min{f[j]}+a[i] (i-m<=j<=i-1)
我們想到了用單調隊列進行優化,由于隨著i的循環,每次只有一個i進入決策區間也只有一個i出決策區間,由于每次選取決策區間中的最小值,所以維護一個單調遞增序列,每次取出隊首元素即可。
為什么可以將隊尾元素無情的刪去呢?由于后進隊的序列同時滿足在原序列中的位置更靠后和其在動態規劃中的價值更大。這樣選取這個元素就要比選取之前的任何一個決策要優,所以之前被刪掉的決策都是無用的。
這道題的本質就是用單調隊列維護了決策本身的價值和其在原序列中位置的同時單調。
要特別注意單調隊列中的值是決策在原決策序列中的位置。
補充:
設f[i]表示點燃當前位置烽火臺,且前i個滿足要求的最小代價。
顯然就有f[i]=min(f[j])+a[i](i-m<=j<=i-1)。
當然,這會超時,所以要有優化。
優化一:肯定是從前m個里選小的,涉及到區間最小值,可用線段樹,時間復雜度將為O(n log m)。
優化二:同樣因為要選前m個最小的,使用單調隊列,隊列里存有不超過m個長度單位的值,每次取隊首,進隊時維護隊列使其單調不下降,復雜度將為O(n)。