給出$n\times m$的方格,有些格仔不能鋪線,其它格仔必須鋪,形成乙個閉合迴路。問有多少種鋪法?
使用括號表示法記錄狀態,記1為 '(' ,2為 ')' ,0為無插頭,
分8種情況討論:
優化:使用鍊錶儲存狀態為模數同餘系的狀態;滾動陣列
#include#include【模板】插頭dp#include
using
namespace
std;
int n,m,map[15][15],endx,endy,bits[15],pre=1,cur,tots[2],state[2][600000],head[600000
],tot;
const
int mod=590027
;long
long ans,dp[2][600000
];struct
edge
edge[
600000
];inline
intread()
while(ch>='
0'&&ch<='9'
)
return f*w;
}void insert(int sta,long
long
val)
}tots[cur]++;
state[cur][tots[cur]]=sta;
dp[cur][tots[cur]]=val;
edge[++tot]=(edge);
head[key]=tot;
}void
dp()
for(int j=1;j<=m;j++)
}else
if(!d&&!r)
}else
if(!d&&r)
if(map[i][j+1
])
}else
if(!r&&d)
if(map[i+1
][j])
}else
if(r==1&&d==1
)
else
if((nowsta>>bits[l])%4==2
)
if(!cnt)}}
else
if(r==2&&d==2
)
else
if((nowsta>>bits[l])%4==2
)
if(!cnt)}}
else
if(r==2&&d==1
)
else}}
}}
}int
main()
if(ch=='.'
) }}
for(int i=1;i<=14;i++)
dp();
printf(
"%lld\n
",ans);
return0;
}
P5056 模板 插頭dp
插頭dp的模板 插頭dp括號序列的方法其實就是利用迴路不能交叉匹配,必定兩兩配對的性質通過括號序列描述了連通塊的匹配關係 注意分類討論 判斷狀態合法 最邊上一圈不能有插頭延伸過去,要注意 include include include define int long long using names...
P5056 模板 插頭dp
給出n m的方格,有些格仔不能鋪線,其它格仔必須鋪,形成乙個閉合迴路。問有多少種鋪法?第1行,n,m 2 n,m 12 從第2行到第n 1行,每行一段字串 m個字元 表不能鋪線,表必須鋪 輸出乙個整數,表示總方案數 4 4 2none 插頭dp本來以為多niubility的演算法原來本質還是個dp,...
P5056 模板 插頭dp
n m 的網格,求有多少條迴路可以鋪滿整個棋盤。插頭 dp 的,寫法是按照題解上的寫法。狀態用的是括號匹配,然後用了雜湊 鄰接表 掛表 還有滾動陣列優化空間 然後可以看題解學 include include includeusing namespace std const int p 133331 ...