LG P5056 模板 插頭dp

2022-06-12 12:54:08 字數 1584 閱讀 7636

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

使用括號表示法記錄狀態,記1為 '(' ,2為 ')' ,0為無插頭,

分8種情況討論:

優化:使用鍊錶儲存狀態為模數同餘系的狀態;滾動陣列

#include#include

#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;

}

【模板】插頭dp

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