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