dp的一些優化

2022-05-03 06:03:10 字數 2011 閱讀 7087

單調佇列優化

當dp[i][j]從一段區間轉移而來,且這段區間隨i,j的後移而後移/前推時,可以考慮用單調佇列掃一遍,可將o(n^2)優化至o(n)。

四邊形不等式優化

形如dp[i][j]=min的dp方程,//取max不一定滿足四邊形不等式

若對於i<=i'<=j<=j',有w(i',j)<=w(i,j')(即區間包含單調性)和w(i,j)+w(i',j')<=w(i',j)+w(i,j')(即四邊形不等式),則:

1.dp(i,j)+dp(i',j')<=dp(i',j)+dp(i,j');

2.記g(i,j)為對dp(i,j)最優的k,則決策點g(i,j)滿足單調性,即g(i,j)<=g(i+1,j)<=g(i+1,j+1) => g(i-1,j)<=g(i,j)<=g(i,j+1)/g(i,j-1)<=g(i,j)<=g(i+1,j);

因此列舉k時不必從1到i,可以直接由g(i-1,j)到g(i,j+1);對於固定的i-j,i,j=>g(i-1,j)~g(i,j+1)、i+1,j+1=>g(i,j+1)~g(i+1,j+2)、i+2,j+2=>g(i+1,j+2)~g(i+2,j+3)…這些區間互不重疊,因此σg(i,j+1)-g(i-1,j)<=n

時間複雜度由o(n^3)優化到o(n^2)。

一般而言,為了保證迴圈到dp(i,j)時g(i,j-1),g(i+1,j)已知,i應倒序列舉,j應正序列舉。至於內外層自變數,依題目要求保證順利轉移即可。

決策單調性優化

決策單調性指的是,dp[i]的最優轉移點k隨ik

'>i

'>增大保持單調不減。

二維情況可用四邊形不等式證明。

兩種實現方法:

1)分治

**難度較小,但得出dp值無先後順序(從中間開始二分,也就從中間開始算),一般適用於二維dp(dp[i][j]由dp[i-1][j]轉移而來,而i相同時同一維彼此線性無關)o(nlogn)

1

//l,r: 被決策點的下/上界2//

l,r: 決策點的下/上界

3void work(int i,int l,int r,int l,intr)4

17// mid值已算出,從二分序列剔除

18 work(i,l,mid-1

,l,pos);

19 work(i,mid+1,r,pos,r);

2)單調棧/單調佇列

較為普適,但必須能在較短時間內(通過預處理)算出w(i,j),比如說o(1)。總複雜度o(nlogn)。

//sta[0]記錄棧中元素,sta[1]記錄此元素作為決策點的最小被決策點

//找到以p作為決策點的最小被決策點(與棧頂的決策點相比即可)

int find(int

p)

return

ll;}

void

work()

}}// 模板根據不同題目會有較大變動

p5504 [jsoi2011] 檸檬 

比較罕見的決策點單調遞減的題,而且不是全序列單調性,只有大小相同的貝殼之間轉移才有單調性,所以二分找最優決策點時mid代表的不是序列編號,而是在同種大小貝殼中的編號。寫的時候犯了不少錯誤,比如x寫成y,忘記mid特殊性等。

在將i壓入棧前,要先檢查當前棧頂p代替i成為最優決策點的時間是否大於(棧頂-1)q代替棧頂成為最優的時間;若是,則要不斷將棧頂彈出。否則會存在時間t,q比p優,但p不比i優,此時存在q比i優的可能性,但由於先前沒有把p彈出,此時無法繞過p直接比較i和q,從而錯過最優決策點。這個思想很重要,大部分決策單調的題都要考慮類似情況。

斜率優化

未完

凸優化

未完

優化的一些例項

優化使用的工具,使用loadrunner做為壓力測試工具,使用jprobe進行 剖析。1 第乙個例項。原狀況 呼叫乙個api,發現執行的時間很高,用jprobe分析,發現消耗時間最長的是把快取中的乙個樹從第三個節點進行扁平化,就是把第二個節點的子樹構造為乙個列表,不知道為什麼構造這個資料的耗時比直接...

mysql的一些優化

前言 sql優化,是一種概率層面的優化。至於是否實際使用了我們的優化,需要通過explain進行推測。注意 服務層中有sql優化器,可能會影響我們的優化,同時註明 sql的優化前提是有索引 有索引 有索引 in和exists的使用場景 select from a where exists selec...

Elasticsearch的一些優化

1.多執行緒程式插入,可以根據伺服器情況開啟多個執行緒index 速度可以提高n倍,n 2 2.如果有多台機器,可以以每台設定n個shards的方式,根據業務情況,可以考慮取消replias curl xput d 這裡設定20個shards,複製為0,如果需要replicas,可以完成index後...