Advertisement
AlexG2230954

Untitled

Mar 25th, 2022
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.58 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. // не содержат ли столбцы полные квадраты? (закрашенные или пустые)
  7. bool possible(int a, int b, int m) {
  8.     for(int i = 0; i < m - 1; i++) {
  9.         if(((a & 3) == (b & 3)) && ((a & 3) == 0 || (a & 3) == 3))
  10.             return false;
  11.  
  12.         a = a >> 1;
  13.         b = b >> 1;
  14.     }
  15.  
  16.     return true;
  17. }
  18.  
  19. // генерирует таблицу сравнения всех возможных столбцов высоты m
  20. vector< vector<int> > generate_comparsion_table(int m) {
  21.     vector< vector<int> > can(1 << m, vector<int>(1 << m));
  22.    
  23.     for(int mask_a = 0; mask_a < (1 << m); mask_a++)
  24.         for(int mask_b = 0; mask_b < (1 << m); mask_b++)
  25.             can[mask_a][mask_b] = possible(mask_a, mask_b, m);
  26.    
  27.     return can;
  28. }
  29.  
  30. // генерирует таблицу возможных комбинаций
  31. vector< vector<int> > generate_dp(int m, int n, const vector< vector<int> > & can) {
  32.     vector< vector<int> > dp(n, vector<int>(1 << m));
  33.    
  34.     for(int mask = 0; mask < (1 << m); mask++)
  35.             dp[0][mask] = 1;
  36.  
  37.     for(int i = 1; i < n; i++)
  38.         for(int a = 0; a < (1 << m); a++)
  39.             for(int b = 0; b < (1 << m); b++)
  40.                 dp[i][a] += dp[i - 1][b] * can[a][b];
  41.  
  42.     return dp;
  43. }
  44.  
  45. int main() {
  46.     ios::sync_with_stdio(false);
  47.     cin.tie(0);
  48.  
  49.     int n, m;
  50.     int ans = 0;
  51.     vector< vector<int> > can;
  52.     vector< vector<int> > dp;
  53.    
  54.     cin >> n >> m;
  55.     can = generate_comparsion_table(m);
  56.     dp = generate_dp(m, n, can);
  57.  
  58.     for(int mask = 0; mask < (1 << m); mask++)
  59.         ans += dp.back()[mask];
  60.  
  61.     cout << ans << endl;
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement