長度 \(n\) 逆序對為 \(k\) 的排列有幾鍋?\(dp[i][j]\) 前 \(i\) 個數 產生 \(j\) 的逆序對的方案數,\(k <=200\)
\(k <= 2000\)
排列計數問題經典套路
滿足排列套路,把1-n往後查,
因為新插入的數是更大的所以,分別考慮插在最後邊,次後邊...
\(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]\)wssb---knight列舉步數,ij分別表示兩個紙條的橫座標,利用步數求得縱座標
固定同行,除去冗雜真實座標
現階段學習計畫
資料結構與演算法 c python 程式設計之法 資料結構中各種樹 技術面試寶典 常用資料結構及複雜度 演算法複雜度速查表 15道使用頻率極高的基礎演算法題 常用的十大程式設計演算法介紹 面試中的排序演算法總結 資料庫 資料庫的最簡單實現 資料庫的原理 儲存過程簡介 漫談資料庫索引 mysql 索引...
PPP發現階段
ppp 發現階段 初始化pppoe 會話時,cpe路由器必須首先執行發現階段,以識別與其建立對等關係的裝置的 mac位址,建立乙個 pppoe session id 發現程序實質上是乙個客戶端 伺服器關係,在發現階段,路由器會發現服務提供商的接入集中器。cpe路由器可以在發現階段找到所有可用匯聚裝置...
StoneAgeDict現階段設計小結
今天和zy結隊程式設計了一天,討論了很多問題。主要是圍繞詞庫的開放式 實時的基本特性討論的。下面是對這兩個特性的基本描述 註冊使用者可以在查詢出來的詞彙中提交自己的詞彙解釋。這個解釋將被遞交到詞庫審核組,由審核組的工作人員審核這個提交。例如,使用者daniel查詢了beyond這個詞彙,但是對這個詞...