POJ 1180 斜率優化DP

2022-05-24 04:24:10 字數 1073 閱讀 7454

前記:好像半年前就見過這道題,折騰了半天都不會,剛學斜率優化,發現這題挺經典的,也不難,只要能想到倒推~

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

分析:dp[i] = min(dp[j] + (s + sumt[i] - sumt[j]) *sumf[i] )

其中sumt[i]表示從i到n的任務所需要的時間總和,sumf[i]表示從i到n的費用係數總和,dp[i]表示對於從i到n的任務安排的最優解。

其實想到倒推這個方程挺好寫的,

為什麼倒推,因為「時刻」這個東西很黑! 它只與此時刻之前的狀態有關,與此時刻之後的狀態無關

具體的斜率優化可以參考:

有非常詳細的思考過程及方法,模擬著就能做出來。

注意邊界!

view code

1 #include 2 #include 3 #include 4

5#define n 1200067

using

namespace

std;89

intn,s,t[n],f[n],sumf[n],sumt[n],dp[n],q[n];

1011

void

read()

1220}21

22 inline int g(int y,int

x)23

2627 inline int s(int y,int

x)28

3132

void

go()

3351

}52 printf("

%d\n

",dp[1

]);53}54

55int

main()

5662

return0;

63 }

poj 1180 斜率優化dp

這個題目要是順著dp的話很難做,但是倒著推就很容易退出比較簡單的關係式了。dp i min dp u sum u 1 sum i 1 s f i dp i 代表從i到結尾需要花費的代價,sum i 表示1到i的時間和,f i 代表i到n的代價和。然後對於i狀態來說,j由於k等價於 dp j dp k...

poj1180 dp斜率優化

解題報告題目 題目大意 給定n 個工作,可以任意分組,最後每個工作的花費是 o i f i 其中o i 是i 所在分組整體被完成的時間,給定開始時間,機器啟動時間 s,求完成所有任務最小花費。演算法 動態規劃 斜率優化 思路 首先想到了 dp i min,sumf i f i f i 1 然後化解這...

POJ 2018 斜率優化DP

給一堆數,選不少於f個數的子串行,求均值最大的子串行。最原始的斜率dp優化題目,最初出現在周源的國家隊 中。儘管這個題是最原始的題,但是這個題並不能用常用的套路。這個題的狀態轉移方程很明顯,但是卻不是標準的斜率優化方程 當然也差不多 優化的話,基本上還是老套路,用乙個單調佇列進行優化。在選擇最優元素...