动态规划 —— 状压 DP
【概述】
通常將以一個集合內的元素信息作為狀態且狀態總數為指數級別的動態規劃稱為狀態壓縮動態規劃。
其是一類以集合信息為狀態的特殊的動態規劃問題,主要有傳統集合動態規劃與基于連通性狀態壓縮的動態規劃兩種。
其原理是通過二進制位運算將狀態壓縮(用整數表示集合)作為動態規劃的狀態來解決問題。
通常具備以下兩個特點:
為更好的理解狀壓 DP,首先要有相關的位運算知識,關于位運算:點擊這里。
【使用條件】
在任意時刻,已經求出最優解的狀態與尚未求出最優解的狀態在各維度上的分界點組成了 DP 擴展的輪廓,對于某些問題,需要在動態規劃的狀態中記錄一個集合,保存這個輪廓的詳細信息,以便進行狀態轉移。
若集合大小不超過 n,集合中每個元素都是小于 k 的自然數,則可以把這個集合看作一個 n 位 k 進制數,以一個??之間的十進制整數的形式作為 DP 狀態的一維。
【使用技巧】
1.狀壓 DP 題型
1)數據 n≤16 ,但狀態總數可達指數級
2)滿足無后效性原則,通過前面的狀態知道后面的怎么選,用 1、0 來記錄狀態是否存在
2.一般定義二維數組
第一維是第幾排(如:鋪磚塊等)
第二維標識狀態,0 或 1
3.數組初始化
根據題設設置初值,一般為 memset(dp,127,sizeof(dp));
再進行狀態更新:
for(int i=0;i<n;i++) ? dp[i][1<<i]=0;?表示 i 在 state 中存在,這里的 1<<i 就是一種只選 i 的 state
4.枚舉狀態循環求值
for(int i=1;i<=n;i++) {for(int j=0;j<(1<<m);j++){if(check(i,j))//判斷當前行滿足條件的state{for(int k=0;k<(1<<m);k++)//枚舉上一行的pre_state進行更新{...}}} }5.判斷狀態中的每一個是否符合要求
for(int i=sum;i!=0;i=(i-1)&sum) {... }【例題】
1.入門題
2.TSP 問題
3.其他
總結
以上是生活随笔為你收集整理的动态规划 —— 状压 DP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Silver Cow Party(POJ
- 下一篇: 暑期训练日志----2018.8.14