【學習小結】插頭DP

論文部分

orz litble

基於連通性的狀態壓縮方法

1. 最小表示法壓縮聯通塊

可以把聯通塊從左到右最小標號。也可以按照同一聯通塊中的最小下標標號

2. 對於路徑用括號序表示

因爲路徑不可能相交,所以這樣表示可以大大減少狀態
如果不是迴路,而是路徑,記錄獨立插頭,但獨立插頭最多隻有兩個

3. 只對插頭狀壓連通性

其他部分因爲已經聯通,不用考慮

4. 最後用hash來存狀態

直接在插入狀態的時候更新DP值。
用位運算簡化代碼和加速。
不用寫繁瑣的encode和extract函數

void ins(int zt,ll num){ //直接在hash的過程中更新答案
	int tmp = zt % Has + 1;
	for (int i = h[tmp] ; i ; i = ne[i])
		if ( a[now][i] == zt ) { f[now][i] += num; return; }
	ne[++tot[now]] = h[tmp] , h[tmp] = tot[now]; //在鏈表前面添加
	a[now][tot[now]] = zt , f[now][tot[now]] = num;
}

例題

注意:
轉移一定要推清楚!不能有半點馬虎!
插頭DP的難點在於不知道該怎麼調。至少無法輸出調試。只能肉眼查錯
必須儘量一次AC

1. Ural 1519 Formula 1

論文題
括號序表示插頭連通性

如果可以用多個迴路覆蓋?
那麼不需要記錄連通性,直接用插頭轉移

2. 七月集訓 by HbFs

3. GDKOI2016 Map 地圖

題目大意:有一張n×m n \times mn×m的地圖,有些地方是平地’.’,有些是障礙’#’,有些是未知的’?’,還有入口’S’,出口’E’和神器’X’。
合法的地圖只有一個入口一個出口一個神器,並且入口,出口和神器兩兩連通。
現在要確定未知格子’?'是什麼,問有多少種確定未知格子的方案使得地圖合法?保證至少存在一種方案。
1n71m71 \leq n \leq 7,1 \leq m \leq7

這道題只要求聯通,就需要最小表示法記錄路徑。可以看前面litble的博客

4. Black & White

這題主要是優化狀態

後面的題都還沒有寫,一定要抽時間寫,才能掌握!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章