OI補完計畫 Day2斜率優化

2022-08-22 21:30:11 字數 2251 閱讀 8429

今天補上前天的欠賬。斜率優化。。。

動態規劃是一種非常重要的思想,它的重點在於合理的表示出問題中的狀態,不重不漏,讓問題變得合理有序,狀態之間並可以高效的轉移,從而方便地解決問題。

然而,乙個方程在轉移過程中可能會做許多無用功。這時我們就要合理的優化狀態轉移過程,捨棄那些一定不為最優解的決策,是動態規劃得到優化。而怎樣判斷什麼一定不是最優決策呢?這是我們就要去探求決定決策一與決策二優劣程度的內在條件,有時他是和狀態無關的(當前狀態一旦確定,那麼兩個決策的優劣程度就確定了)。看起來括號裡的是廢話,但如果我們將上乙個狀態的決策優劣程度應用於當前的決策,我們就可以,不必迴圈所有決策就可以找到最優決策,當然這是某些情況下。

斜率優化便是利用這樣的思想,巧妙的利用斜率的大小將決策的優劣程度直觀的展現出來,使問題的時間複雜度大幅下降,甚至到達問題的下界。這是乙個經典的思想,直觀的表示,高效的轉移,極低的程式設計複雜度,使它成為優秀的演算法。

先來看乙個例題:

【問題描述】

n個任務排成乙個序列在一台機器上等待完成(順序不得改變),這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工,第i個任務單獨完成所需的時間是ti。在每批任務開始前,機器需要啟動時間s,而完成這批任務所需的時間是各個任務需要時間的總和(同一批任務將在同一時刻完成)。每個任務的費用是它的完成時刻乘以乙個費用係數fi。請確定乙個分組方案,使得總費用最小。

例如:s=1;t=;f=。如果分組方案是、、,則完成時間分別為,費用c=,總費用就是153。

【輸入格式】

第一行是n(1<=n<=5000)。

第二行是s(0<=s<=50)。

下面n行每行有一對數,分別為ti和fi,均為不大於100的正整數,表示第i個任務單獨完成所需的時間是ti及其費用係數fi。

【輸出格式】

乙個數,最小的總費用。

【輸入樣例】batch.in

1 33 2

4 32 3

1 4【輸出樣例】batch.out

直接上方程吧。。。

start表示啟動時間,sumt[i]表示前i個任務的時間和,sumf[i]表示i到n的費用和。

考慮對於確定狀態i來說的,a和b兩個決策。

假設決策a優於決策b,即:

變形得: 

觀察發現關於決策的幾項被放在了同一邊,那麼便符合了上文提到的」決策優劣的無關性』』。此時考慮表示式的形式,有些與斜率形似。那麼是否可以考慮使用數形結合呢?

將決策排成一排(如圖中的節點),那麼相鄰兩個節點間的連線的斜率便可以表示,關係始終的左側。而右側是關於i的表示式,他是判斷狀態i時兩決策優劣的標準,即用斜率的之和標準比較即可得到優劣關係,而決策間的斜率是和狀態無關的,以下稱之為篩選斜率。

那麼對於斜率不斷增大的一排點來說,若隊頭兩點的斜率大於篩選斜率,那麼對優劣性來說,前乙個決策均優於後乙個決策。那麼我們就可以直接選第乙個決策作為最優決策。可是實際上我們將1到i-1的所有決策均表示在座標系中時,斜率並不是單調遞增的。那麼,如何選出最優決策呢?

我們發現導致斜率非單調遞增的節點就是形如上圖中的紅色節點。他顯然不在所有決策的下凸殼上,而我們可以證明的是,』』這樣』』的點當篩選斜率為任何值時,其均不為最優決策。

方法是通過分類討論,讀者可以自己嘗試證明一下。

這樣我們就獲得了乙個決策的下凸殼,可以方便的選出決策。我們現由最簡單的情況引入,若題目中決策點的x座標是隨狀態單調遞增的,且篩選斜率也為單調遞增的。就像本題中的sumf(x座標),start+sumt(篩選斜率)。那麼,我們可以直接在隊頭刪除斜率小於篩選斜率的節點(這些決策是劣於後乙個決策的),知道篩選斜率小於隊頭斜率,那麼,隊頭便為最優決策。每次在隊尾加入決策(因為決策x座標單調),刪除不在凸殼上的點即可。這樣通過乙個雙端佇列,維護狀態i的最優決策,時間複雜度為o(n)。

再考慮第二種情況,若篩選斜率不為單調怎麼辦?我們可以發現,我們無法再刪除隊頭結點了,因為之前刪除的節點可能因為篩選斜率的減小再一次成為最優決策。那麼考慮,什麼樣的節點是最優的,即它和前面的節點的斜率小於篩選斜率,而和後面節點的斜率大於篩選斜率,顯然其為最優決策。而斜率是單調的,我們可以採用二分法,時間複雜度為o(nlogn)。

還有一種比較坑爹的情況,那就是決策點的x座標不是單調的,那麼意味著我們在增加決策的時候,不一定在隊尾增加。這是我們只能動態的維護乙個凸包,這是極其麻煩的,用到平衡樹來維護,想法是比較簡單的,就是實現無限悲劇啊。

一一計畫(Day 2 )鏈式棧

顧名思義這裡的棧是與煉表相掛鉤,因為鍊錶和棧有個共同的性質就是先進後出,所以寫法與鍊錶相似 1.寫出棧的資料結構 2.建立棧也就是初始化過程 3.寫出節點的資料結構 因為入棧前得要用東西可以入到棧裡面 4.建立節點 5.入棧 也就是插入節點寫法與鍊錶相同 6.獲取棧頂元素 7.出棧 也就是刪除節點寫...

阿里雲高校計畫 Day2學習打卡

一 今天的學習內容 1.通過阿里雲的ocr去識別認證自己的身份證 2.先上傳自己身份證 開始識別 二 系統的底層邏輯 1.需要將圖形上傳至oss中去 2.通過sdk來上傳至ocr 3.利用邏輯上的不同,設定不一樣的按鈕 4.隱藏式的內容 通過某個部件 放到input的組建中 三 怎樣獲取sdk 1....

NOIP2015提高組Day2 運輸計畫

其實題目說那麼多,一句話就是 給定一棵帶權樹與m mm條路徑,你可以使一條樹上的邊的權值變為0,問你m mm條路徑的長度的最大值最小是多少。這道題讓我想到了貨車運輸這道題,但是更難,但方法可以借鑑。因為這是最大值最小問題,很顯然可以二分答案。那這個二分判斷怎麼打呢?我們如果遇到某條邊,所有超時的邊 ...