Advertisement
_no0B

Untitled

Nov 13th, 2021
915
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.43 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define N ((int)6e4 + 5)
  4. #define MOD ((int)1e9 + 7)
  5. #define MAX ((int)1e9 + 7)
  6. #define MAXL ((ll)1e18 + 7)
  7. #define MAXP ((int)1e3 + 7)
  8. #define thr 1e-8
  9. #define pi acos(-1)  /// pi = acos ( -1 )
  10. #define fastio ios_base::sync_with_stdio(false),cin.tie(NULL)
  11. #define endl "\n"
  12.  
  13. using namespace std;
  14.  
  15. int cnt[22];
  16.  
  17. int solve(int mask, int sum) /// mask = 101100111100011, newMask = 101100100000011
  18. {
  19.     if(mask == 0) return 0;
  20.     if(dpp[mask] != -1) return dpp[mask];
  21.     int ans = MAX;
  22.     for(int i = 0 ; i < n ; i++)
  23.     {
  24.         if(mask & (1<<i))
  25.         {
  26.             int newMask = mask , newSum = sum;
  27.             for(int j = 0 ; j < 3 ; j++)
  28.             {
  29.                 int bit = i+j;
  30.                 if(bit >= n) bit -= n;
  31.                 if(newMask & (1<<bit))
  32.                 {
  33.                     newMask ^= 1<<bit;
  34.                     newSum -= cnt[bit];
  35.                 }
  36.             }
  37.             int damage = newSum;
  38.             ans = min(ans, solve(newMask , newSum) + damage);
  39.         }
  40.     }
  41.     return dpp[mask] = ans;
  42. }
  43.  
  44. /// state: O(2^n);
  45. /// time complexity: O(2^n * n)
  46.  
  47. int main()
  48. {
  49.  
  50.     /// problem: https://acm.timus.ru/problem.aspx?space=1&num=1152
  51.  
  52.     memset(dpp,-1,sizeof dpp);
  53.     int sum = 0;
  54.     for(int i = 0 ; i < n ; i++) sum += cnt[i];
  55.     cout<<call((1<<n) - 1 , sum)<<endl;
  56.  
  57.     /// preprocess
  58.     for(int mask = 0 ; mask < (1<<n) ; mask++)
  59.     {
  60.         int damage = 0
  61.         for(int j = 0 ; j < n ; j++)
  62.         {
  63.             if(mask & (1<<j)) damage += cnt[j];
  64.         }
  65.         sum[mask] = damage;
  66.     }
  67.  
  68.     dpp[0] = 0;
  69.     for(int mask = 1 ; mask < (1<<n) ; mask++)
  70.     {
  71.         int ans = MAX;
  72.         for(int i = 0 ; i < n ; i++)
  73.         {
  74.             if(mask & (1<<i))
  75.             {
  76.                 int newMask = mask;
  77.                 for(int j = 0 ; j < 3 ; j++)
  78.                 {
  79.                     int bit = i+j;
  80.                     if(bit >= n) bit -= n;
  81.                     if(newMask & (1<<bit))
  82.                     {
  83.                         newMask ^= 1<<bit;
  84.                     }
  85.                 }
  86.                 int damage = 0;
  87.                 for(int j = 0 ; j < n ; j++)
  88.                 {
  89.                     if(newMask & (1<<j)) damage += cnt[j];
  90.                 }
  91.                 ans = min(ans, dpp[newMask] + damage);
  92.             }
  93.         }
  94.         dpp[mask] = ans;
  95.     }
  96.  
  97. }
  98.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement