DP現階段優化

2022-02-24 21:12:51 字數 2918 閱讀 5045

長度 \(n\) 逆序對為 \(k\) 的排列有幾鍋?

\(k <=200\)

\(k <= 2000\)

排列計數問題經典套路

滿足排列套路,把1-n往後查,

\(dp[i][j]\) 前 \(i\) 個數 產生 \(j\) 的逆序對的方案數,

因為新插入的數是更大的所以,分別考慮插在最後邊,次後邊...

\(dp[i+1][j+x]+=dp[i][j](x\ belong\ 0,1,2,...i+1)\)

往後轉移

上面的式子向前轉移為

\(dp[i][j] = \sum_^dp[i-1][j-k]\)

我們通過式子可以發現有取和的操作,如果每次操作都開一層迴圈來計算的話,時間複雜度會多以個 \(n\), 但是我們用字首和優化則可以 \(o(1)\) 實現

做法如下:

方程:上述

我們設:

\(f[i][j] = \sum_^dp[i][k]\)

表示前 \(i\) 個數 產生 \(j\) 的逆序對的方案數的總和(\(i\) 固定)

則轉移為:

\(dp[i][j] = f[i-1][j]-f[i-1][j-i]\)

這樣直接轉移則可以 \(o(1)\) 了

在這個 \(dp\) 基礎上,做容斥原理,通過之前講的整數劃分的模型 \(dp\) 求出容斥係數即可

發現求和操作可以利用字首和相減, 達到 \(o(1)\)

轉移區間是求和問題

從 \(o(n)\) 轉移 均攤到每個轉移複雜度變小

一般形式

\[dp[i] = max\+g[i]\\

dp[i] = max\+g[i]\\

dp[l][i] = max\+g[i]

\]

注\ \(j\) 取值是一段連續區間,區間的兩個端點隨 \(i\) 的增大而增大的區間

如果左端固定,那麼可以直接記錄字首最小值(固定擴大視窗,記錄字首和即可)

暴力dp狀態

\(f[i][j]=\beginf[i-1][j]&no\ do\\f[i-1-w][k]-ap[i]\times(j-k)&buy\\ f[i-1-w][k]+bp[i]\times(k-j)&sell\end\)

解釋一下為什麼上邊的\(j\), \(k\) 的關係,

當**時, **數在增加,故 \(j > k\)

當賣出時, **數在減少,故 \(k > j\)

單調佇列優化

取出其中乙個化簡得

\(f[i][j] = f[i-w-1][k]+ap[i]\times k- ap[i] \times j\)

發現存在 \(k\) 的式子是與先前的狀態有關的,只有後一式子對\(i,j\) 的才產生影響,這種模型符合單調佇列,

並且我們需要的決策點 \(k\) 與 \(j\) 存在一定的區間關係,即當 \(j\) 改變時,\(k\) 也在移動,進而形成了乙個固定區間的移動視窗,以為視窗右移,存在單調性,故可以用單調佇列

亮眼的地方:找到與座標無關的(座標值表包括決策內容,即\(j\))和 與座標有關的

利用的原因,我們想減少時間複雜度,因此可以將 \(k\) 那一維省去,利用單調佇列,讓佇列中時刻保持當前最有用的多個決策點(這也是單調佇列的普遍原理)

這樣我們可以在轉移時總時間複雜度達到 \(o(n)\) 轉移,均攤下來就是 \(o(n)\)

for (int j = 0; j <= maxp; j++)

while(head <= tail && id[head] < j - as[i]) head++;

}

hdu4374

最大值和方案數

轉移都是以區間,決策點方案求和的話就可以字首和相減

字首和--決策區間不一定單調遞增

單調佇列--決策區間必須是單調區間,

區間最大值,帶修改

線段樹和樹狀陣列

特徵 每次座標小於某個值的權值中的最大值

權值作為下標記錄區間,權值線段樹????

時間複雜度 \(o(nlogn)\)

\[f[i]=max\+1

\]

特徵總結,課後記

挖掘題目性質特點

因為比較大小,無序了解數字的具體,利用離散化

換一思路

找乙個最大值 \(k\) 滿足條件 存在 \(dp[j]=k\&\& a[j] < a[i]\)

沒記。。。

如果前者大於後者,那麼後者長度為k+1,那麼可以提取k的子串行,他的元素要比上乙個要,那麼上一就不是最小值了,不符合定義條件(近似貪心)

二分+貪心

\(f[i][j][k][l]\)

列舉步數,ij分別表示兩個紙條的橫座標,利用步數求得縱座標

固定同行,除去冗雜真實座標

wssb---knight

現階段學習計畫

資料結構與演算法 c python 程式設計之法 資料結構中各種樹 技術面試寶典 常用資料結構及複雜度 演算法複雜度速查表 15道使用頻率極高的基礎演算法題 常用的十大程式設計演算法介紹 面試中的排序演算法總結 資料庫 資料庫的最簡單實現 資料庫的原理 儲存過程簡介 漫談資料庫索引 mysql 索引...

PPP發現階段

ppp 發現階段 初始化pppoe 會話時,cpe路由器必須首先執行發現階段,以識別與其建立對等關係的裝置的 mac位址,建立乙個 pppoe session id 發現程序實質上是乙個客戶端 伺服器關係,在發現階段,路由器會發現服務提供商的接入集中器。cpe路由器可以在發現階段找到所有可用匯聚裝置...

StoneAgeDict現階段設計小結

今天和zy結隊程式設計了一天,討論了很多問題。主要是圍繞詞庫的開放式 實時的基本特性討論的。下面是對這兩個特性的基本描述 註冊使用者可以在查詢出來的詞彙中提交自己的詞彙解釋。這個解釋將被遞交到詞庫審核組,由審核組的工作人員審核這個提交。例如,使用者daniel查詢了beyond這個詞彙,但是對這個詞...