P5056 模板 插頭dp

2022-07-20 04:27:07 字數 1249 閱讀 4575

給出n*m的方格,有些格仔不能鋪線,其它格仔必須鋪,形成乙個閉合迴路。問有多少種鋪法?

第1行,n,m(2<=n,m<=12)

從第2行到第n+1行,每行一段字串(m個字元),"*"表不能鋪線,"."表必須鋪

輸出乙個整數,表示總方案數

4 4

**..

....

....

....

2
none

插頭dp本來以為多niubility的演算法原來本質還是個dp,就是情況多了點qwq

狀壓分割線,有三種情況,無,左插頭,右插頭(詳見洛谷題解懶得寫了)

只要明白狀態分析出所有情況即可

#include#define ll long long

ll in()

std::unordered_mapf[2];

//我tm就不寫hash表

int n, m, s, t;

bool mp[100][100];

char getch()

void init()

}ll pos(int v, int x)

//返回第x大塊的v狀態(兩個二進位制來狀壓)

ll work()

// 0 0

if(!l && !r)

//2 1

else if(l == 2 && r == 1)

// 0 1 // 1 0 // 0 2 // 2 0

else if(!l || !r)

//同上

else if(!r)

}//1 1 // 2 2

else if(l == r) }}

//根上面差不多

else if(l == 2) }}

}//本狀態當且僅當是終點,用於封口

else if(l == 1 && r == 2 && i == s && j == t) return val;

}std::swap(now, nxt);

} f[nxt].clear();

//末尾的豎分割線到了下一行就變成了行首的分割線,把狀態《給分割線騰出地方

for(auto &k:f[now]) f[nxt][(k.first << 2) & u] += k.second;

std::swap(now, nxt);

} return 0;

}int main()

P5056 模板 插頭dp

插頭dp的模板 插頭dp括號序列的方法其實就是利用迴路不能交叉匹配,必定兩兩配對的性質通過括號序列描述了連通塊的匹配關係 注意分類討論 判斷狀態合法 最邊上一圈不能有插頭延伸過去,要注意 include include include define int long long using names...

P5056 模板 插頭dp

n m 的網格,求有多少條迴路可以鋪滿整個棋盤。插頭 dp 的,寫法是按照題解上的寫法。狀態用的是括號匹配,然後用了雜湊 鄰接表 掛表 還有滾動陣列優化空間 然後可以看題解學 include include includeusing namespace std const int p 133331 ...

洛谷 P5056 模板 插頭dp

題目鏈結 題意 給出n m的方格,有些格仔不能鋪線,其它格仔必須鋪,形成乙個閉合迴路。問有多少種鋪法?思路比賽時基本做不出來,就學個新演算法玩玩。學習鏈結 對於我這個不會hash table 的不太友好,先自己封裝了乙個用著舒服的hash table,當然也可以直接用stl裡的unordered m...