1. 程式人生 > 其它 >AcWing 301. 任務安排2

AcWing 301. 任務安排2

題目傳送門

一、題目分析

\(DP\)問題分析和優化是分開的

任務安排II 只是把\(n\)的範圍擴大了,從\(5000\)長到了\(300000\)

剛才任務安排I的方法是\(O(N^2)\)級的,\(300000\)的平方肯定要超時了,需要優化。雙層迴圈,萬惡之源

方法是斜率優化,比較有特點:

整理公式:
\(f(i)=min{ f(j) + sumT_i * (sumC_i-sumC_j)+ S * (sumC_n-sumC_j) }\)

一般在討論\(i\)時,把\(i\)看作常量,把\(j\)視為變數。

我們把關於\(j\)的整理出來
\(f(i)=f(j) - (sumT_i+S)* sumC_j+sumT_i*sumC_i+S*sumC_n\)

\(f(j)=f(i)+(sumT_i+S)*sumC_j-sumT_i*sumC_i-S*sumC_n\)

\(y=f(j)\) \(x=sumCj\)
就是
\(y=f(i)+(sumT_i+S)*x-sumT_i*sumC_i-S*sumC_n\)

因為只有\(x\),\(y\)是變數,所以這就是一個直線方程\(y=kx+b\)的形式。\(k\)為斜率,\(b\)為截距
其中
\(k=sumT_i+S\)
\(b=f(i)-sumT_i*sumC_i-S*sumC_n\)

因為題目中的\(T\)\(C\)都是\(>=1\) && \(<=512\),所以\(sumT_i+S\)

必然是正整數,也就是直線方程是斜率大於\(0\)小於\(90\),從左向右上升的直線。

畫到直角座標系中,就是橫軸是\(sumC_j\),縱軸是\(f(j)\) \(0<=j<=i-1\) ,其實就是\((sumC_0,f(0)),(sumC_1,f(1)),(sumC_2,f(2)),...(sumC_{i-1},f(i-1))\)

我們的目標是什麼呢?目標只有一個:就是讓\(f(i)\)最小!

什麼情況下\(f(i)\)最小呢?因為斜率是固定的,截距越小,\(f(i)\)越小。