백준 1102 발전소
유형
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class BOJ1102 {
    static int N, P;
    static int cost[][];
    static char powerplant[];
    static int dp[];
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stz;
        N = Integer.parseInt(br.readLine());
        cost = new int[N][N];
        for(int i = 0; i < N; i++) {
            stz = new StringTokenizer(br.readLine());
            for(int j = 0; j < N; j++) {
                cost[i][j] = Integer.parseInt(stz.nextToken());
            }
        }
        dp = new int[1 << N];
        Arrays.fill(dp, -1);
        powerplant = br.readLine().toCharArray();
        P = Integer.parseInt(br.readLine());
        int on = 0;
        int cnt = 0;
        for(int i = 0; i < N; i++) {
            if(powerplant[i] == 'Y') {
                on = on | (1 << i);
                cnt++;
            }
        }
        
        if(cnt == 0) {
            if(P == 0) System.out.println(0);
            else System.out.println(-1);
        }
        else if(cnt >= P) {
            System.out.println(0);
        }
        else {
            System.out.println(findMinimumCost(cnt, on));
        }
    }
    static int findMinimumCost(int cnt, int on) {
        if(cnt == P) return 0;
        if(dp[on] != -1) return dp[on];
        dp[on] = Integer.MAX_VALUE;
        for(int i = 0; i < N; i++) {
            if((on & (1 << i)) != 0) {
                for(int j = 0; j < N; j++) {
                    if((on & (1 << j)) == 0) {
                        dp[on] = Math.min(dp[on], cost[i][j] + findMinimumCost(cnt + 1, on | (1 << j)));
                    }
                }
            } 
        }
        return dp[on];
    }
}