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