先%mmh学长。
这个东西还好吧。。。。
也算是个状压,难的也不会,就会写个板子题。
用哈希map代替了哈希表。
一、P5056 【模板】插头dp:
题目背景
ural 1519
陈丹琦《基于连通性状态压缩的动态规划问题》中的例题
题目描述
给出n*m的方格,有些格子不能铺线,其它格子必须铺,形成一个闭合回路。问有多少种铺法?
输入格式
第1行,n,m(2<=n,m<=12)
从第2行到第n+1行,每行一段字符串(m个字符),"*“表不能铺线,”."表必须铺
输出格式
输出一个整数,表示总方案数
输入输出样例
输入 #1 复制
4 4
**…
…
…
…
输出 #1 复制
2
输入 #2 复制
4 4
…
…
…
…
输出 #2 复制
6
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<map>
#include<unordered_map>
#define ll long long
#define llu unsigned ll
using namespace std;
const int maxn=20;
const int maxx=2000100;
const int mod=4;
char str[maxn][maxn];
int pm[maxn][maxn],n,m,ex,ey;
int b[maxn],bm[maxn];
int cnt[2],sta[2][maxx],k=0;
unordered_map<int,ll>dp[2];
ll ans=0;
void init(void)
{
for(int i=0;i<=13;i++)
b[i]=(i<<1);
for(int i=0;i<=13;i++)
bm[i]=(1<<b[i]);
}
void in(int nowsta,ll sum)
{
if(dp[k].find(nowsta)==dp[k].end())
{
sta[k][++cnt[k]]=nowsta;
dp[k][nowsta]=sum;
}
else dp[k][nowsta]+=sum;
}
void DP(void)
{
cnt[k]=1;
dp[k][0]=1;
sta[k][1]=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int p=k;
k^=1;
dp[k].clear();
cnt[k