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\)
畫到直角座標系中,就是橫軸是\(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)\)越小。