Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define ll long long
- #define N ((int)6e4 + 5)
- #define MOD ((int)1e9 + 7)
- #define MAX ((int)1e9 + 7)
- #define MAXL ((ll)1e18 + 7)
- #define MAXP ((int)1e3 + 7)
- #define thr 1e-8
- #define pi acos(-1) /// pi = acos ( -1 )
- #define fastio ios_base::sync_with_stdio(false),cin.tie(NULL)
- #define endl "\n"
- using namespace std;
- int cnt[22];
- int solve(int mask, int sum) /// mask = 101100111100011, newMask = 101100100000011
- {
- if(mask == 0) return 0;
- if(dpp[mask] != -1) return dpp[mask];
- int ans = MAX;
- for(int i = 0 ; i < n ; i++)
- {
- if(mask & (1<<i))
- {
- int newMask = mask , newSum = sum;
- for(int j = 0 ; j < 3 ; j++)
- {
- int bit = i+j;
- if(bit >= n) bit -= n;
- if(newMask & (1<<bit))
- {
- newMask ^= 1<<bit;
- newSum -= cnt[bit];
- }
- }
- int damage = newSum;
- ans = min(ans, solve(newMask , newSum) + damage);
- }
- }
- return dpp[mask] = ans;
- }
- /// state: O(2^n);
- /// time complexity: O(2^n * n)
- int main()
- {
- /// problem: https://acm.timus.ru/problem.aspx?space=1&num=1152
- memset(dpp,-1,sizeof dpp);
- int sum = 0;
- for(int i = 0 ; i < n ; i++) sum += cnt[i];
- cout<<call((1<<n) - 1 , sum)<<endl;
- /// preprocess
- for(int mask = 0 ; mask < (1<<n) ; mask++)
- {
- int damage = 0
- for(int j = 0 ; j < n ; j++)
- {
- if(mask & (1<<j)) damage += cnt[j];
- }
- sum[mask] = damage;
- }
- dpp[0] = 0;
- for(int mask = 1 ; mask < (1<<n) ; mask++)
- {
- int ans = MAX;
- for(int i = 0 ; i < n ; i++)
- {
- if(mask & (1<<i))
- {
- int newMask = mask;
- for(int j = 0 ; j < 3 ; j++)
- {
- int bit = i+j;
- if(bit >= n) bit -= n;
- if(newMask & (1<<bit))
- {
- newMask ^= 1<<bit;
- }
- }
- int damage = 0;
- for(int j = 0 ; j < n ; j++)
- {
- if(newMask & (1<<j)) damage += cnt[j];
- }
- ans = min(ans, dpp[newMask] + damage);
- }
- }
- dpp[mask] = ans;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement