給出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...