Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define forn(i, n) for (int i = 0; i < int(n); i++)
- using namespace std;
- const int N = 1000 + 13;
- const int M = 1 << 12;
- const int INF = int(1e9);
- int dp[N][4][M];
- int n;
- int a[4];
- string f[4];
- int main() {
- cin >> n;
- forn(i, 4)
- cin >> a[i];
- forn(i, 4){
- cin >> f[i];
- f[i] += "....";
- }
- n += 4;
- forn(i, n + 1) forn(j, 4) forn(k, M) dp[i][j][k] = INF;
- dp[2][3][0] = 0;
- forn(i, n) forn(j, 4) forn(mask, M){
- int st = i * 4 + j - 11;
- int ni = st / 4;
- int nj = st % 4;
- if (st < 0)
- continue;
- if (n - ni >= 4 && nj == 0){
- dp[i + 1][3][M - 1] = min(dp[i + 1][3][M - 1], dp[i][j][mask] + a[3]);
- }
- if ((mask & 1) || f[nj][ni] == '.'){
- int _ni = (i * 4 + j + 1) / 4;
- int _nj = (i * 4 + j + 1) % 4;
- dp[_ni][_nj][mask >> 1] = min(dp[_ni][_nj][mask >> 1], dp[i][j][mask]);
- }
- for (int t = 1; t <= min(min(n - ni, 4 - nj), 3); ++t){
- int nmask = mask;
- int len = (1 << t) - 1;
- forn(pos, t)
- nmask |= (len << (4 * pos));
- dp[i][j][nmask] = min(dp[i][j][nmask], dp[i][j][mask] + a[t - 1]);
- }
- }
- printf("%d\n", dp[n][0][0]);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement