HackerRank The Blacklist problem solution YASH PAL, 31 July 2024 In this HackerRank The Blacklist problem solution A new gangster is trying to take control of the city. He makes a list of his N adversaries (e.g. gangster 1, gangster 2, … gangster N – 1, gangster N) and plans to get rid of them. K mercenaries are willing to do the job. The gangster can use any number of these mercenaries. But he has to honor one condition set by them: they have to be assigned in such a way that they eliminate a consecutive group of gangsters in the list, e.g. gangster i, gangster i + 1, …, gangster j – 1, gangster j, where the following is true: 1 <= i <= j <= N. While our new gangster wants to kill all of them, he also wants to pay the least amount of money. All mercenaries charge a different amount to kill different people. So he asks you to help him minimize his expenses. Problem solution in Python. #!/bin/python3 import os import sys N, K = map(int, input().split()) cost = [] MASK = 2<<K INF = 10**8-1 for i in range(K): prices = list (map(int, input().split())) prices.reverse() cost.append(prices) dp = [] for i in range(MASK): dp.append([INF] * (N + 1)) dp[0][0] = 0 def hitman_available(hitman, mask): return not (2 << hitman) & mask def use_hitman(hitman, mask): return mask | (2 << hitman) for already_killed in range(N): for mask in range(MASK): for hitman in range(K): if hitman_available(hitman, mask): mask_after = use_hitman(hitman, mask) for num_to_kill in range(1, N - already_killed+1): dp[mask_after][num_to_kill + already_killed] = min( dp[mask_after][num_to_kill + already_killed], dp[mask][already_killed] + sum(cost[hitman][already_killed:already_killed+num_to_kill])) print (min(dp[i][N] for i in range(MASK))) Problem solution in Java. import java.io.*; import java.util.*; public class Solution { static final int INF = Integer.MAX_VALUE / 10; static boolean hitmanAvailable(int hitman, int mask) { return (((2 << hitman)) & mask) == 0; } static int useHitman(int hitman, int mask) { return mask | (2 << hitman); } static int sum(int[][] amounts, int hitman, int alreadyKilled, int numToKill) { int s = 0; for (int i = alreadyKilled; i < alreadyKilled + numToKill; i++) { s += amounts[hitman][i]; } return s; } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH"))); StringTokenizer st = new StringTokenizer(br.readLine()); int n = Integer.parseInt(st.nextToken()); int k = Integer.parseInt(st.nextToken()); int[][] amounts = new int[k][n]; for (int i = 0; i < k; i++) { st = new StringTokenizer(br.readLine()); for (int j = 0; j < n; j++) { int item = Integer.parseInt(st.nextToken()); amounts[i][j] = item; } } int maskMax = 2 << k; int[][] dp = new int[maskMax][n + 1]; for (int i = 0; i < maskMax; i++) { for (int j = 0; j < n + 1; j++) { dp[i][j] = INF; } } dp[0][0] = 0; for (int alreadyKilled = 0; alreadyKilled < n; alreadyKilled++) { for (int mask = 0; mask < maskMax; mask++) { for (int hitman = 0; hitman < k; hitman++) { if (hitmanAvailable(hitman, mask)) { int maskAfter = useHitman(hitman, mask); for (int numToKill = 1; numToKill < n - alreadyKilled + 1; numToKill++) { dp[maskAfter][numToKill + alreadyKilled] = Math.min( dp[maskAfter][numToKill + alreadyKilled], dp[mask][alreadyKilled] + sum(amounts, hitman, alreadyKilled, numToKill)); } } } } } int result = Integer.MAX_VALUE; for (int i = 0; i < maskMax; i++) { result = Math.min(result, dp[i][n]); } bw.write(String.valueOf(result)); bw.newLine(); bw.close(); br.close(); } } Problem solution in C++. #include<bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define clr(x) x.clear() #define For(i,a,b) for(i=a;i<b;i++) #define loop(i,b) for(i=0;i<b;i++) #define Loop(i,b) for(i=1;i<=b;i++) #define pi(n) printf("%d ",n) #define si(n) scanf("%d",&n) const int MOD=1e9+7; typedef pair<int,int> PII; typedef vector<PII> VPII; typedef vector<int> VI; typedef long long LL; #define F first #define S second #define sz size #define pLL(x) cout<<x<<' ' #define fill(x,c) memset(x,c,sizeof(x)) #define DB(x) cout<<__LINE__<<" :: "<<#x<< ": "<<x<<endl; #define DB2(x, y) cout<<__LINE__<<" :: "<<#x<< ": "<<x<<" | "<<#y<< ": "<<y<<endl; #define DB3(x, y, z) cout<<__LINE__<<" :: "<<#x<< ": "<<x<<" | "<<#y<< ": "<<y<<" | "<<#z<<": "<<z<<endl int a[30][30]; int dp[30][30][1<<12]; int N,K; LL solve(int curr,int prev,int done) { int i; if(curr == N) return 0; LL val; if(prev != 12) { val=(LL)a[prev][curr]; val+=solve(curr+1,prev,done); } else val=1e15; if(dp[curr][prev][done]!=-1) return dp[curr][prev][done]; for(i=0;i<K;++i) { if(((done>>i)&1) == 0) val=min(val,a[i][curr]+solve(curr+1,i,done|(1<<i))); } return (dp[curr][prev][done]=val); } int main() { int n,t,m,l,k,ans,i,j,res=0,fl; t=1; while(t--) { si(n); si(m); N=n;K=m; loop(i,m) { loop(j,n) si(a[i][j]); } memset(dp,-1,sizeof(dp)); cout<<solve(0,12,0)<<endl; } return 0; } Problem solution in C. #include <stdio.h> #include <stdlib.h> #define INF 300000 int mine(int x,int y); int table[10][20],dp[10][1024][20]; int main(){ int N,K,i,j,k,l,min=-1; scanf("%d%d",&N,&K); for(i=0;i<K;i++) for(j=0;j<N;j++) scanf("%d",&table[i][j]); for(k=0;k<N;k++) for(j=0;j<(1<<K);j++) for(i=0;i<K;i++){ if(!(j&(1<<i))) dp[i][j][k]=INF; else if(!k) if(j!=(1<<i)) dp[i][j][k]=INF; else dp[i][j][k]=table[i][k]; else{ dp[i][j][k]=dp[i][j][k-1]; for(l=0;l<K;l++) if(l!=i && (1<<l)&j) dp[i][j][k]=mine(dp[i][j][k],dp[l][j^(1<<i)][k-1]); dp[i][j][k]+=table[i][k]; } } for(i=0;i<K;i++) for(j=0;j<(1<<K);j++) if(min==-1 || dp[i][j][N-1]<min) min=dp[i][j][N-1]; printf("%d",min); return 0; } int mine(int x,int y){ return (x<y)?x:y; } algorithm coding problems