題目鏈結
l公司有n個工廠,由高到底分布在一座山上。
工廠1在山頂,工廠n在山腳。 由於這座山處於高原內陸地區(乾燥少雨),l公司一般把產品直接堆放在露天,以節省費用。
突然有一天,l公司的總裁l先生接到氣象部門的**,被告知三天之後將有一場暴雨,於是l先生決定緊急在某些工廠建立一些倉庫以免產品被淋壞。
由於地形的不同,在不同工廠建立倉庫的費用可能是不同的。第i個工廠目前已有成品pi件,在第i個工廠位置建立倉庫的費用是ci。
對於沒有建立倉庫的工廠,其產品應被運往其他的倉庫進行儲藏,而由於l公司產品的對外銷售處設定在山腳的工廠n,故產品只能往山下運(即只能運往編號更大的工廠的倉庫),當然運送產品也是需要費用的,假設一件產品運送1個單位距離的費用是1。
假設建立的倉庫容量都都是足夠大的,可以容下所有的產品。你將得到以下資料:
輸入格式:
第一行包含乙個整數n,表示工廠的個數。接下來n行每行包含兩個整數xi, pi, ci, 意義如題中所述。
輸出格式:
僅包含乙個整數,為可以找到最優方案的費用。
輸入樣例#1:
3輸出樣例#1:0 5 10
5 3 100
9 6 10
32在工廠1和工廠3建立倉庫,建立費用為10+10=20,運輸費用為(9-5)*3 = 12,總費用32。
如果僅在工廠3建立倉庫,建立費用為10,運輸費用為(9-0)5+(9-5)3=57,總費用67,不如前者優。
對於20%的資料, n ≤500;
對於40%的資料, n ≤10000;
對於100%的資料, n ≤1000000。 所有的xi, pi, ci均在32位帶符號整數以內,保證中間計算結果不超過64位帶符號整數。
先暫且不看資料的範圍,只考慮如何解決題目,很容易可以想到o(n^2)的dp。
dp[i]表示在i這個工廠建立倉庫,從工廠1到工廠i所需要的最小費用。
dp的轉移方程為\(dp[i]=c[i]+min(dp[j]+\sum_^(p[k]*(x[i]-x[k])))\)
化簡後轉移方程為\(dp[i]=c[i]+min(dp[j]+x[i]*\sum_^p[k]-\sum_^(p[k]*x[k]))\)
但是n的取值範圍為1000000,所以n^2的時間複雜度肯定是過不了的,所以這裡用斜率優化,把求min的複雜度降低。
因為\(\sum_^p[k]\)和\(\sum_^(p[k]*x[k])\)中p和x是輸入的資訊,可以用字首和快速求出。
所以我們設s[i]=\(\sum_^p[k]\),ss[i]=\(\sum_^(p[k]*x[k])\)。
所以轉移方程變成了\(dp[i]=c[i]+min(dp[j]+x[i]*(s[i]-s[j])-(ss[i]-ss[j]))\)
我們取\(j\),\(k\)滿足 \(k且\(j\)比\(k\)更優,那麼有如下不等式:
\(c[i]+dp[j]+x[i]*(s[i]-s[j])-(ss[i]-ss[j])
化簡後得到\(\frac
看到\(\frac\)有沒有想到斜率呢?(\(\frac\))
有了這個不等式後我們就可以利用斜率優化了。
因為斜率要小於x[i]所以我們可以用下凸殼來維護。
沒有學習過凸包的同學請先去學習凸包。
上**:
#includeusing namespace std;
int n;
long long x[1000009],p[1000009],c[1000009];
long long a[1000009],b[1000009],pp[2000009];
long long dp[1000009],l=1,r=1;
double js(int j,int k)
int main()
printf("%lld",dp[n]);
return 0;
}
ZJOI2007 倉庫建設
l公司有n個工廠,由高到底分布在一座山上。如圖所示,工廠1在山頂,工廠n在山腳。由於這座山處於高原內陸地區 乾燥少雨 l公司一般把產品直接堆放在露天,以節省費用。突然有一天,l公司的總裁l先生接到氣象部門的 被告知三天之後將有一場暴雨,於是l先生決定緊急在某些工廠建立一些倉庫以免產品被淋壞。由於地形...
ZJOI 2007 倉庫建設
注意到我們所有的東西都只能轉移到後面,那麼可以考慮dp 用dp i 表示以i結尾建立倉庫的最小花費 那麼dp i min dp i dp j w i sigma dis i dis k num k 這個dp直接轉移是n 2 考慮優化這個dp 然後他是由前面所有的轉移過來,而且還有其他的陣列來計算答案...
ZJOI2007 倉庫建設
傳送門 考慮用dp i 表示把前i個地點的物品全部安置好的最小花費。因為物品只能往下運,所以當前這個位置必須建倉庫,dp方程很好想 dp i min p k x i x k c i 用 sum n 表示 sum np i ssum n 表示 sum np i x i 之後把式子變個型套斜率優化就好了...