P3170-[CQOI2015]标识设计【插头dp】
生活随笔
收集整理的這篇文章主要介紹了
P3170-[CQOI2015]标识设计【插头dp】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:https://www.luogu.com.cn/problem/P3170
題目大意
給出n?mn*mn?m的網格上有一些障礙,要求用三個LLL形(高寬隨意,不能退化成線段/點)覆蓋格子且LLL形之間不能重疊。
求覆蓋方案(每個LLL形相同)
2≤n,m≤302\leq n,m\leq 302≤n,m≤30
解題思路
一道比模板要簡單的插頭dpdpdp?(當然我依舊不會)
先是考慮插頭的狀態,每個LLL形的話,一個還沒有涂完的LLL形可能是右插頭或者下插頭,因為只有三個所以最多只會有333個下插頭,這樣的狀態數是Cm3C_m^3Cm3?的,在500050005000以內。
把這些狀態壓縮起來,然后設fx,y,s,k,0/1f_{x,y,s,k,0/1}fx,y,s,k,0/1?表示現在dpdpdp到格子(x,y)(x,y)(x,y),目前下插頭狀態為sss,已經插入了kkk個LLL形(作為下插頭),目前有沒有右插頭。
轉移的話就很簡單了,如果下一個格子有障礙那它上面就不能有插頭,如果這個格子上面有插頭就分為結束這個下插頭變為一個右插頭或者不結束。
如果這個格子有右插頭那么就不能有上插頭。
沒有這些限制就能夠開一個下插頭。
需要注意到行尾的時候可能會還有右插頭,在最右邊加一列障礙就好了。
時間復雜度是O(nmCm3)O(nmC_{m}^3)O(nmCm3?)的
code
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=32,M=5100; ll n,m,cnt,f[N][M][4][2]; ll id[N][N][N],pi[M],pj[M],pk[M]; bool v[N][N];char s[N]; void init(){for(ll i=0;i<=m;i++)for(ll j=i?(i+1):0;j<=m;j++)for(ll k=j?(j+1):0;k<=m;k++){id[i][j][k]=++cnt;pi[cnt]=i;pj[cnt]=j;pk[cnt]=k;}ll p[3];for(ll i=0;i<=m;i++)for(ll j=0;j<=m;j++)for(ll k=0;k<=m;k++){p[0]=i;p[1]=j;p[2]=k;sort(p,p+3);id[i][j][k]=id[p[0]][p[1]][p[2]];}return; } signed main() {scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++){scanf("%s",s+1);for(ll j=1;j<=m;j++)if(s[j]=='#')v[i][j]=1;}m++;for(ll i=1;i<=n;i++)v[i][m]=1;ll g=0;f[0][1][0][0]=1;init();for(ll p=1;p<=n*m;p++){ll x=(p-1)/m+1,y=(p-1)%m+1;g^=1;memset(f[g],0,sizeof(f[g]));for(ll s=1;s<=cnt;s++){ll a=pi[s],b=pj[s],c=pk[s];for(ll k=0;k<=3;k++){if(f[!g][s][k][0]){if(!v[x][y]){f[g][s][k][0]+=f[!g][s][k][0];if(y==a)f[g][id[0][b][c]][k][1]+=f[!g][s][k][0];else if(y==b)f[g][id[a][0][c]][k][1]+=f[!g][s][k][0];else if(y==c)f[g][id[a][b][0]][k][1]+=f[!g][s][k][0];else if(k<3) f[g][id[y][b][c]][k+1][0]+=f[!g][s][k][0];}else if(y!=a&&y!=b&&y!=c)f[g][s][k][0]+=f[!g][s][k][0];}if(f[!g][s][k][1]&&!v[x][y]&&y!=a&&y!=b&&y!=c){f[g][s][k][1]+=f[!g][s][k][1];f[g][s][k][0]+=f[!g][s][k][1];}}}}printf("%lld\n",f[g][1][3][0]);return 0; }總結
以上是生活随笔為你收集整理的P3170-[CQOI2015]标识设计【插头dp】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CF453C-Little Pony a
- 下一篇: P4457-[BJOI2018]治疗之雨