1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| using namespace std; char c[5][1005]; int n,p,q,r,s; bool a[5][1005]; int dp[1005][5555]; int tmp[5][5]; inline int get(){ int rt=0,cnt=0; for(int i=1;i<=4;++i){ for(int j=2;j<=4;++j){ rt+=tmp[i][j]<<cnt; ++cnt; } } return rt; } inline void rget(int msk){ for(int i=1;i<=4;++i){ for(int j=1;j<=3;++j){ tmp[i][j]=msk&1; msk>>=1; } } } inline void Min(int&x,int y){if(x>y)x=y;} int tmpc[555][5][5],sta; inline void cpy(){++sta;for(int i=1;i<=4;++i)for(int j=1;j<=4;++j)tmpc[sta][i][j]=tmp[i][j];} inline void rcpy(){for(int i=1;i<=4;++i)for(int j=1;j<=4;++j)tmp[i][j]=tmpc[sta][i][j];--sta;} inline void go(int i,int j,int msk,int cur=0){ if(j==5){ Min(dp[i+1][get()],dp[i][msk]+cur); return; } if(j==1)Min(dp[i+1][0],dp[i][msk]+s); if(j<=2){ cpy(); for(int e=0;e<3;++e)for(int f=0;f<3;++f)tmp[j+f][e+1]=0; go(i,j+1,msk,cur+r); rcpy(); } if(j<=3){ cpy(); for(int e=0;e<2;++e)for(int f=0;f<2;++f)tmp[j+f][e+1]=0; go(i,j+1,msk,cur+q); rcpy(); } { cpy(); tmp[j][1]=0; go(i,j+1,msk,cur+p); rcpy(); } if(tmp[j][1]==0)go(i,j+1,msk,cur); } inline void solve(){ cin>>n>>p>>q>>r>>s; for(int i=1;i<=4;++i){ for(int j=1;j<=n;++j)cin>>c[i][j]; for(int j=n+1;j<=n+3;++j)c[i][j]='.'; } n+=3; for(int i=1;i<=4;++i){ for(int j=1;j<=n;++j){ if(c[i][j]=='.')a[i][j]=0; else a[i][j]=1; } } memset(dp,63,sizeof(dp)); int inf=dp[0][0]; for(int i=1;i<=4;++i)for(int j=1;j<=3;++j)tmp[i][j+1]=a[i][j]; dp[4][get()]=0; for(int i=4;i<=n;++i){ for(int msk=0;msk<(1<<12);++msk){ if(dp[i][msk]>=inf)continue; rget(msk); for(int j=1;j<=4;++j)tmp[j][4]=a[j][i]; go(i,1,msk); } } cout<<dp[n+1][0]<<'\n'; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0),cout.tie(0); int T=1; for(;T--;)solve(); return 0; }
|