本文由labuladong
原創,本博文僅作為知識點學習,不會用於任何商業用途!
動態規劃技巧對於演算法效率的提公升非常可觀,一般來說都能把指數級和階乘級時間複雜度的演算法優化成 o(n^2),堪稱演算法界的二向箔,把各路魑魅魍魎統統打成二次元。
但是,動態規劃本身也是可以進行階段性優化的,比如說我們常聽說的「狀態壓縮」技巧,就能夠把很多動態規劃解法的空間複雜度進一步降低,由 o(n^2) 降低到 o(n),
能夠使用狀態壓縮技巧的動態規劃都是二維dp
問題,你看它的狀態轉移方程,如果計算狀態dp[i][j]
需要的都是dp[i][j]
相鄰的狀態,那麼就可以使用狀態壓縮技巧,將二維的dp
陣列轉化成一維,將空間複雜度從 o(n^2) 降低到 o(n)。
什麼叫「和dp[i][j]
相鄰的狀態」呢,比如前文 最長回文子串行 中ÿ
動態規劃的降維
01揹包問題 有n件物品和乙個容量為c的揹包。第i件物品的費用是w i 價值是v i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。w i 表示物品i的重量 v i 表示物品i的價值 c 表示揹包的容量 dp i c 表示前i件物品恰放入乙個容量為c的揹包可以獲得的最大...
狀態壓縮動態規劃
動態規劃的狀態有時候比較難,不容易表示出來,需要用一些編碼技術,把狀態壓縮的用簡單的方式表示出來。典型方式 當需要表示乙個集合有哪些元素時,往往利用2進製用乙個整數表示。一般有個資料 n 16 或者 n 32 這個很可能就是狀態dp的標誌,因為我們要用乙個int的二進位制來表示這些狀態。要注意好這些...
動態規劃 狀態壓縮
這個題目的題意很容易理解,在乙個n m的格仔裡,我們現在有兩種型別的磚塊,1 2和 2 1,問一共有多少種方案,可以將整個n m的空間都填滿。最簡單的例子就是下面的了 程式設計之美中題目 某年夏天,位於希格瑪大廈四層的微軟亞洲研究院對辦公樓的天井進行了一次大規模的裝修.原來的地板鋪有 n m 塊正方...