YEZAELP

SMMR-110: Magic Spell IV

Jul 27th, 2021 (edited)
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.25 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int N = 60 + 10;
  5. const int INF = 60 * 4;
  6. char A[N], B[N], C[N], D[N];
  7. int dp[N][N][N][N];
  8. int la, lb, lc, ld;
  9.  
  10. bool check(int a, int b, int c, int d){
  11.     return a <= la and b <= lb and c <= lc and d <= ld;
  12. }
  13.  
  14. int f(int a, int b, int c, int d){
  15.     if(a == la and b == lb and c == lc and d == ld) return 0;
  16.  
  17.     if(dp[a][b][c][d] != INF) return dp[a][b][c][d];
  18.  
  19.     int cnt = INF;
  20.     /// 4
  21.     if(check(a + 1, b + 1, c + 1, d + 1) and A[a] == B[b] and B[b] == C[c] and C[c] == D[d])
  22.         cnt = min(cnt, 1 + f(a + 1, b + 1, c + 1, d + 1));
  23.  
  24.     /// 3
  25.     if(check(a + 1, b + 1, c + 1, d) and A[a] == B[b] and B[b] == C[c])
  26.         cnt = min(cnt, 1 + f(a + 1, b + 1, c + 1, d));
  27.  
  28.     if(check(a + 1, b + 1, c, d + 1) and A[a] == B[b] and B[b] == D[d])
  29.         cnt = min(cnt, 1 + f(a + 1, b + 1, c, d + 1));
  30.  
  31.     if(check(a + 1, b, c + 1, d + 1) and A[a] == C[c] and C[c] == D[d])
  32.         cnt = min(cnt, 1 + f(a + 1, b, c + 1, d + 1));
  33.  
  34.     if(check(a, b + 1, c + 1, d + 1) and B[b] == C[c] and C[c] == D[d])
  35.         cnt = min(cnt, 1 + f(a, b + 1, c + 1, d + 1));
  36.  
  37.     /// 2
  38.     if(check(a + 1, b + 1, c, d) and A[a] == B[b])
  39.         cnt = min(cnt, 1 + f(a + 1, b + 1, c, d));
  40.  
  41.     if(check(a + 1, b, c + 1, d) and A[a] == C[c])
  42.         cnt = min(cnt, 1 + f(a + 1, b, c + 1, d));
  43.  
  44.     if(check(a + 1, b, c, d + 1) and A[a] == D[d])
  45.         cnt = min(cnt, 1 + f(a + 1, b, c, d + 1));
  46.  
  47.     if(check(a, b + 1, c, d + 1) and B[b] == D[d])
  48.         cnt = min(cnt, 1 + f(a, b + 1, c, d + 1));
  49.  
  50.     if(check(a, b + 1, c + 1, d) and B[b] == C[c])
  51.         cnt = min(cnt, 1 + f(a, b + 1, c + 1, d));
  52.  
  53.     if(check(a, b, c + 1, d + 1) and C[c] == D[d])
  54.         cnt = min(cnt, 1 + f(a, b, c + 1, d + 1));
  55.  
  56.     /// 1
  57.     if(check(a + 1, b, c, d))
  58.         cnt = min(cnt, 1 + f(a + 1, b, c, d));
  59.  
  60.     if(check(a, b + 1, c, d))
  61.         cnt = min(cnt, 1 + f(a, b + 1, c, d));
  62.  
  63.     if(check(a, b, c + 1, d))
  64.         cnt = min(cnt, 1 + f(a, b, c + 1, d));
  65.  
  66.     if(check(a, b, c, d + 1))
  67.         cnt = min(cnt, 1 + f(a, b, c, d + 1));
  68.  
  69.     return dp[a][b][c][d] = cnt;
  70. }
  71.  
  72. int main(){
  73.  
  74.     scanf("%s", A);
  75.     scanf("%s", B);
  76.     scanf("%s", C);
  77.     scanf("%s", D);
  78.  
  79.     la = strlen(A), lb = strlen(B), lc = strlen(C), ld = strlen(D);
  80.  
  81.     for(int a = 0; a < la; a ++)
  82.         A[a] = tolower(A[a]);
  83.     for(int b = 0; b < lb; b ++)
  84.         B[b] = tolower(B[b]);
  85.     for(int c = 0; c < lc; c ++)
  86.         C[c] = tolower(C[c]);
  87.     for(int d = 0; d < ld; d ++)
  88.         D[d] = tolower(D[d]);
  89.  
  90.     for(int a = la; a >= 0; a --){
  91.         for(int b = lb; b >= 0; b --){
  92.             for(int c = lc; c >= 0; c --){
  93.                 for(int d = ld; d >=0; d--){
  94.                     if(a == la and b == lb and c == lc and d == ld) {
  95.                         dp[a][b][c][d] = 0;
  96.                         continue;
  97.                     }
  98.  
  99.                     int cnt = INF;
  100.                     /// 4
  101.                     if(check(a + 1, b + 1, c + 1, d + 1) and A[a] == B[b] and B[b] == C[c] and C[c] == D[d])
  102.                         cnt = min(cnt, 1 + dp[a + 1][b + 1][c + 1][d + 1]);
  103.  
  104.                     /// 3
  105.                     if(check(a + 1, b + 1, c + 1, d) and A[a] == B[b] and B[b] == C[c])
  106.                         cnt = min(cnt, 1 + dp[a + 1][b + 1][c + 1][d]);
  107.  
  108.                     if(check(a + 1, b + 1, c, d + 1) and A[a] == B[b] and B[b] == D[d])
  109.                         cnt = min(cnt, 1 + dp[a + 1][b + 1][c][d + 1]);
  110.  
  111.                     if(check(a + 1, b, c + 1, d + 1) and A[a] == C[c] and C[c] == D[d])
  112.                         cnt = min(cnt, 1 + dp[a + 1][b][c + 1][d + 1]);
  113.  
  114.                     if(check(a, b + 1, c + 1, d + 1) and B[b] == C[c] and C[c] == D[d])
  115.                         cnt = min(cnt, 1 + dp[a][b + 1][c + 1][d + 1]);
  116.  
  117.                     /// 2
  118.                     if(check(a + 1, b + 1, c, d) and A[a] == B[b])
  119.                         cnt = min(cnt, 1 + dp[a + 1][b + 1][c][d]);
  120.  
  121.                     if(check(a + 1, b, c + 1, d) and A[a] == C[c])
  122.                         cnt = min(cnt, 1 + dp[a + 1][b][c + 1][d]);
  123.  
  124.                     if(check(a + 1, b, c, d + 1) and A[a] == D[d])
  125.                         cnt = min(cnt, 1 + dp[a + 1][b][c][d + 1]);
  126.  
  127.                     if(check(a, b + 1, c, d + 1) and B[b] == D[d])
  128.                         cnt = min(cnt, 1 + dp[a][b + 1][c][d + 1]);
  129.  
  130.                     if(check(a, b + 1, c + 1, d) and B[b] == C[c])
  131.                         cnt = min(cnt, 1 + dp[a][b + 1][c + 1][d]);
  132.  
  133.                     if(check(a, b, c + 1, d + 1) and C[c] == D[d])
  134.                         cnt = min(cnt, 1 + dp[a][b][c + 1][d + 1]);
  135.  
  136.                     /// 1
  137.                     if(check(a + 1, b, c, d))
  138.                         cnt = min(cnt, 1 + dp[a + 1][b][c][d]);
  139.  
  140.                     if(check(a, b + 1, c, d))
  141.                         cnt = min(cnt, 1 + dp[a][b + 1][c][d]);
  142.  
  143.                     if(check(a, b, c + 1, d))
  144.                         cnt = min(cnt, 1 + dp[a][b][c + 1][d]);
  145.  
  146.                     if(check(a, b, c, d + 1))
  147.                         cnt = min(cnt, 1 + dp[a][b][c][d + 1]);
  148.  
  149.                     dp[a][b][c][d] = cnt;
  150.                 }
  151.             }
  152.         }
  153.     }
  154.  
  155.     printf("%d", dp[0][0][0][0]);
  156.  
  157.     return 0;
  158. }
Add Comment
Please, Sign In to add comment