前記:好像半年前就見過這道題,折騰了半天都不會,剛學斜率優化,發現這題挺經典的,也不難,只要能想到倒推~
題意: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 45#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優化題目,最初出現在周源的國家隊 中。儘管這個題是最原始的題,但是這個題並不能用常用的套路。這個題的狀態轉移方程很明顯,但是卻不是標準的斜率優化方程 當然也差不多 優化的話,基本上還是老套路,用乙個單調佇列進行優化。在選擇最優元素...