論文部分
基於連通性的狀態壓縮方法
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’。
合法的地圖只有一個入口一個出口一個神器,並且入口,出口和神器兩兩連通。
現在要確定未知格子’?'是什麼,問有多少種確定未知格子的方案使得地圖合法?保證至少存在一種方案。
這道題只要求聯通,就需要最小表示法記錄路徑。可以看前面litble的博客
4. Black & White
這題主要是優化狀態
後面的題都還沒有寫,一定要抽時間寫,才能掌握!