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 arr[22][22] , dpp[2 + (1<<15)] , health[20] ,n;
- int solve(int mask) /// mask = 101100 , newMask = 100100, nxt[mask] = newMask
- {
- 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))
- {
- ans = min(ans, solve(mask ^ (1<<i)) + health[i]);
- for(int j = 0 ; j < n ; j++)
- {
- int damage = arr[j][i];
- if((mask & (1<<j)) == 0 && damage > 0)
- {
- int shots = (health[i] + damage - 1) / damage;
- ans = min(ans, solve(mask ^ (1<<i)) + shots);
- }
- }
- }
- }
- return dpp[mask] = ans;
- }
- /// state: O(2^n);
- /// time complexity: O(2^n * n * n)
- void print(int mask) /// mask = 01110110
- {
- if(mask == 0) return;
- int ans = solve(mask);
- for(int i = 0 ; i < n ; i++) /// i = 2
- {
- if(mask & (1<<i))
- {
- int bestAns = solve(mask ^ (1<<i)) + health[i];
- if(bestAns == ans){
- cout<<i<<" My Gun\n";
- print(mask ^ (1<<i));
- return;
- }
- for(int j = 0 ; j < n ; j++)
- {
- int damage = arr[j][i];
- if((mask & (1<<j)) == 0 && damage > 0)
- {
- int shots = (health[i] + damage - 1) / damage;
- int bestAns = solve(mask ^ (1<<i)) + shots;
- if(ans == bestAns){
- cout<<i<<" Gun: "<<j<<endl;
- print(mask ^ (1<<i));
- return ;
- }
- }
- }
- }
- }
- }
- /// O ( n * n * n )
- int main()
- {
- /// problem: https://lightoj.com/problem/agent-47
- // int n;
- cin>>n;
- for(int i = 0 ; i < n ; i++) cin>>health[i];
- for(int i = 0 ; i < n ; i++){
- string str;
- cin>>str;
- for(int j = 0 ; j < n ; j++) arr[i][j] = str[j] - '0';
- }
- memset(dpp,-1,sizeof dpp);
- cout<<solve((1<<n) - 1)<<endl;
- print((1<<n) - 1);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement