日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

斜率优化(DP)

發(fā)布時(shí)間:2024/3/12 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 斜率优化(DP) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


先來(lái)個(gè)華麗的出場(chǎng)~~
今天,蒟蒻仍在趕知識(shí)點(diǎn)的路上。昨天剛學(xué)過數(shù)位DP,今天又學(xué)了斜率優(yōu)化,被爆錘了。
不扯淡了,現(xiàn)在就來(lái)寫一下總結(jié)吧。
斜率優(yōu)化,既然叫這個(gè)名字,那么,這個(gè)算法的性質(zhì)其實(shí)就已經(jīng)確定了:DP優(yōu)化。
也就是說(shuō),它本身并不像樹形DP或數(shù)位DP那樣解決一些特定性質(zhì)的問題的,而是類似于矩陣乘法那樣,對(duì)于某些DP方程,加速地進(jìn)行轉(zhuǎn)移,以用來(lái)攻克一些給出的n較大時(shí)的情況。
學(xué)了斜率DP,你會(huì)發(fā)現(xiàn),自己學(xué)了多年的數(shù)學(xué)終于!!!在此刻派上了用場(chǎng)。斜率DP,顧名思義,與平面幾何,也就是我們所學(xué)的一次函數(shù)有關(guān)。斜率優(yōu)化往往是用于一些具有遞推性質(zhì)的DP方程中去的。
如:

本題就是一道典型的斜率優(yōu)化問題。首先,在寫斜率優(yōu)化題目的時(shí)候,最重要的一步并非優(yōu)化,而是想出DP轉(zhuǎn)移方程。優(yōu)化可以沒有,但沒有轉(zhuǎn)移方程,一定不行。
就如本題,若n的范圍夠小的話,我們可以雙重循環(huán)枚舉來(lái)搞。開一個(gè)f數(shù)組,f[i]f[i]f[i]表示將前iii個(gè)任務(wù)分組后的最小總費(fèi)用。求f[i]f[i]f[i],我們枚舉j(1?(i?1))j( 1-(i-1) )j(1?(i?1)),將j?ij-ij?i分為一組,求最小總費(fèi)用。
但是,很顯然,本題的nnn太大了,O(n2)O(n^2)O(n2)肯定過不去,這時(shí),就要考慮斜率優(yōu)化了。
考慮一下f[i]f[i]f[i]的表達(dá)式:f[i]=f[j]+(sumc[i]?sumc[j])?sumt[i]+s?(sumc[n]?sumc[j])f[i]=f[j]+(sumc[i]-sumc[j])*sumt[i]+s*(sumc[n]-sumc[j])f[i]=f[j]+(sumc[i]?sumc[j])?sumt[i]+s?(sumc[n]?sumc[j]),將其展開,化為y=kx+by=kx+by=kx+b的形式:f[j]=(sumt[i]+s)?sumc[j]+f[i]?sumc[i]?sumt[i]?s?sumc[n]f[j]=(sumt[i]+s)*sumc[j]+f[i]-sumc[i]*sumt[i]-s*sumc[n]f[j]=sumt[i]+s?sumc[j]+f[i]?sumc[i]?sumt[i]?s?sumc[n],如式子,我們將sumc[j]sumc[j]sumc[j]視為一次函數(shù)中的xxx(sumt[i]+sumc[j])(sumt[i]+sumc[j])sumt[i]+sumc[j]視為kkkf[j]f[j]f[j]視為yyyf[i]?sumc[i]?sumt[i]?s?sumc[n]f[i]-sumc[i]*sumt[i]-s*sumc[n]f[i]?sumc[i]?sumt[i]?s?sumc[n]視為bbb,那么,斜率相同的情況下,為使f[i]f[i]f[i]minminmin,我們就要在(sumc[j],f[j])(sumc[j],f[j])(sumc[j],f[j])的點(diǎn)集中找到使這條直線從下向上找,找到的第一個(gè)點(diǎn)便是所需的jjj
如圖:

對(duì)于任一條斜率大于0的直線,先找到的一定都是圖中的粉色的點(diǎn),而這三點(diǎn)則恰好構(gòu)成了本圖的一個(gè)凸包,所以,我們?cè)谡尹c(diǎn)時(shí),實(shí)際上只需維護(hù)凸包即可,又因本題的sumc[i](也就是一次函數(shù)的k)sumc[i](也就是一次函數(shù)的k)sumc[i]數(shù)k是單調(diào)遞增的,所以,我們可以將凸包中斜率小于當(dāng)前的sumc[i]sumc[i]sumc[i]的點(diǎn)刪去,這就是本題的大致思路了。
代碼如下:

#include<bits/stdc++.h> using namespace std; const int N=4e5; typedef long long LL; int l=0,r=0,n,s,q[N]; LL f[N],c[N],t[N]; int main() {cin>>n>>s;for(int i=1;i<=n;i++){int tt,cc;scanf("%d%d",&tt,&cc);t[i]=t[i-1]+tt;c[i]=c[i-1]+cc;}for(int i=1;i<=n;i++){while(l<r&&(f[q[l+1]]-f[q[l]]<(s+t[i])*(c[q[l+1]]-c[q[l]]))) l++;f[i]=f[q[l]]+t[i]*(c[i]-c[q[l]])+s*(c[n]-c[q[l]]);while(l<r&&((f[i]-f[q[r]])*(c[q[r]]-c[q[r-1]])<=(f[q[r]]-f[q[r-1]])*(c[i]-c[q[r]]))) r--;q[++r]=i;}cout<<f[n];return 0; }

好了,本次的博客就更新到這里。

總結(jié)

以上是生活随笔為你收集整理的斜率优化(DP)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。