P5056 模板 插頭dp

2022-05-01 20:51:07 字數 1398 閱讀 2183

插頭dp的模板

插頭dp括號序列的方法其實就是利用迴路不能交叉匹配,必定兩兩配對的性質通過括號序列描述了連通塊的匹配關係

注意分類討論、判斷狀態合法

最邊上一圈不能有插頭延伸過去,要注意

#include #include #include #define int long long

using namespace std;

int val[2][100001],times[2][100001],now,fir[100001],nxt[100001],cnt[2],n,m,endx,endy,mat[20][20],ans=0,last,pos[40];

const int mod = 100001;

void insert(int c,int num)

}++cnt[now];

val[now][cnt[now]]=c;

times[now][cnt[now]]=num;

nxt[cnt[now]]=fir[t];

fir[t]=cnt[now];

}int getchar(void)

int getval(int x,int pos)

// void print(int x)

// printf("\n");

// }

void dp(void)

//合併兩個聯通分量

else if(plugl&&plugu)

}if(plugl==2&&plugu==1)

if(plugl==1&&plugu==1)}}

if(plugl==2&&plugu==2)}}

}//延續乙個聯通分量

else

if(plugu&&(!plugl))

//上->左

if(!mat[i][j+1])

insert(state,num);}}

}else}}

}}

}signed main()

}for(int i=0;i<=m+1;i++)

mat[0][i]=mat[n+1][i]=1;

for(int i=1;i<=n;i++)

mat[i][0]=mat[i][m+1]=1;

// for(int i=1;i<=n;i++)

pos[0]=1;

for(int i=1;i<30;i++)

pos[i]=pos[i-1]<<1;

// for(int i=0;i<30;i++)

// printf("%lld\n",pos[i]);

dp();

printf("%lld",ans);

return 0;

}

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

洛谷 P5056 模板 插頭dp

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