func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, t, lim = 16;   int w[4], g[1005];   char ch[4][1005];   int num[4][4];   int s[4][4][4];   int dp[1005][16][16][16][16];   int main() {     scanf( %d , &n);     for (int i = 0; i < 4; i++) scanf( %d , &w[i]);     for (int i = 0; i < 4; i++) scanf( %s , ch[i]);     memset(dp, 0x3f, sizeof(dp));     for (int i = 0; i < n; i++) {       t = 0;       for (int j = 0; j < 4; j++) t <<= 1, t += (ch[j][i] ==  . );       g[i] = t;     }     for (int i = n; i < n + 5; i++) g[i] = lim - 1;     dp[0][g[0]][g[1]][g[2]][g[3]] = 0;     for (int i = 0; i < 4; i++)       for (int j = 0; j < 4 - i; j++) {         for (int k = 0; k < 4; k++)           for (int p = 0; p < 4; p++) num[k][p] = 0;         for (int k = 0; k <= i; k++)           for (int p = j; p <= j + i; p++) num[k][p] = 1;         for (int k = 0; k < 4; k++) {           t = 0;           for (int p = 0; p < 4; p++) t <<= 1, t += num[k][p];           s[i][j][k] = t;         }       }     for (int i = 0; i < n; i++)       for (int a = 0; a < lim; a++)         for (int b = 0; b < lim; b++)           for (int c = 0; c < lim; c++)             for (int d = 0; d < lim; d++) {               if (dp[i][a][b][c][d] >= 0x3f3f3f3f) continue;               if (a == lim - 1)                 dp[i + 1][b][c][d][g[i + 4]] =                     min(dp[i + 1][b][c][d][g[i + 4]], dp[i][a][b][c][d]);               for (int j = 0; j < 4; j++)                 for (int k = 0; k < 4 - j; k++)                   dp[i][a | s[j][k][0]][b | s[j][k][1]][c | s[j][k][2]]                     [d | s[j][k][3]] = min(dp[i][a | s[j][k][0]][b | s[j][k][1]]                                              [c | s[j][k][2]][d | s[j][k][3]],                                            dp[i][a][b][c][d] + w[j]);             }     printf( %d , dp[n - 1][lim - 1][lim - 1][lim - 1][lim - 1]);     return 0;   }   