๋ฐ์ ์๋ ์ต๋ 16๊ฐ์ด๊ณ ๋ชจ๋ ๋ฐ์ ์๋ ์ผ์ ธ ์๊ฑฐ๋/๊บผ์ ธ ์๋ , ๋ ๊ฐ์ง ์ํ๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค. ์ผ์ง ์ํ๋ฅผ 1์ด๋ผ๊ณ ํ๊ณ ๊บผ์ ธ ์๋ ์ํ๋ฅผ 0์ด๋ผ๊ณ ํ์.
์ผ์ง ๋ฐ์ ์๋ก๋ง ๊บผ์ ธ ์๋ ๋ฐ์ ์๋ฅผ ์๋์ํฌ ์ ์์ผ๋ฏ๋ก ์ฐ์ ์๋์ํฌ ๊บผ์ง ๋ฐ์ ์๋ฅผ ์ฐพ์ ํ ํด๋น ๋ฐ์ ์๋ฅผ ์ด๋ค ์ผ์ ธ ์๋ ๋ฐ์ ์๋ก ํฌ ๊ฑด์ง๋ฅผ ์ฐพ๊ฒ ๋๋ค.
๋จผ์ ๊บผ์ง ๋ฐ์ ์๋ฅผ ์ฐพ์ ํ, ํด๋น ๋ฐ์ ์๋ฅผ ํค๊ธฐ ์ํด ์ต์ํ์ ๋น์ฉ์ด ํ์ํ ์ผ์ง ๋ฐ์ ์๋ฅผ ์ฐพ์ ๊บผ์ง ๋ฐ์ ์๋ฅผ ํค๋ฉด ๋๋ค. ์ด๋ ๊บผ์ง ๋ฐ์ ์๋ฅผ ์ผ์ ์์ฑ๋๋ ๋ฐ์ ์์ ์๋ ์ํ๋ฅผ ๋ณด๊ณ ํด๋น ์๋ ์ํ๊ฐ ๋๊ธฐ ์ํด ๋๋ ๋น์ฉ์ด ๊ธฐ์กด์ ๋ค๋ ๋น์ฉ๋ณด๋ค ์ ์ ๊ฒฝ์ฐ์๋ง ํด๋น ๋ฐฉ์์ผ๋ก ๊บผ์ง ๋ฐ์ ์๋ฅผ ์๋์ํจ๋ค.
์ด๋ dfs + dp๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋๋ฐ ๋์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
๋นํธ ํ์์ด๊ธฐ ๋๋ฌธ์ ํ์์ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ์ด๋ฃจ์ด์ง๊ฒ ๋๋ค. ๋จผ์ 101001(41)์ด๋ผ๋ ์ซ์๊ฐ ์์ ๋ ๊บผ์ง ๋ฐ์ ์ ์ค ๋นจ๊ฐ์์ผ๋ก ํ์ ๋ ๋ ๊ฐ์ ๋ฐ์ ์๋ฅผ ํจ๋ค๊ณ ๊ฐ์ ํ์. ์ค๋ฅธ์ชฝ์ ์ข ๋ ๊ฐ๊น์ด ๋ฐ์ ์๋ฅผ ๋จผ์ ํ์ํ๊ฒ ๋๊ธฐ ๋๋ฌธ์ ํด๋น ๋ฒํธ ์์๋๋ก ํ์ํ๊ฒ ๋๋ค. ์ค๋ฅธ์ชฝ์์ 3๋ฒ์งธ์ ์๋ ๋ฐ์ ์๋ฅผ ํจ ๋ค์, ์ผ์ชฝ์์ ๋ ๋ฒ์งธ ์๋ ๋ฐ์ ์๋ฅผ ํค๋ ๊ณผ์ ๊น์ง๊ฐ 1, 2๋ฒ ๊ณผ์ ์ด๋ค. ๋ง์ง๋ง ๋จ์ ํ๋์ ๋ฐ์ ์๋ฅผ ํค๋ฉด 3๋ฒ์ด ๋๊ณ ์กฐ๊ฑด์ ๋ง์กฑํ๊ฒ ๋๋ค(์ฌ๊ธฐ์๋ P=6์ด๋ผ๊ณ ๊ฐ์ ). ๋นํธ 111111์ ์กฐ๊ฑด (cnt >= P)์ ๋ง์กฑํ๊ธฐ ๋๋ฌธ์ return 0์ ๋ฐํํ๊ฒ ๋๊ณ dp[111111] ์๋์ ๊ฐ์ ๊ฐ์ ๊ฐ๊ฒ ๋๋ค.
dp[111111] = Math.min(dp[111111], 0 + power[j][i])
dp์ ๋ชจ๋ ์ด๊ธฐ๊ฐ์ INF์ด๊ธฐ ๋๋ฌธ์ ์๋ง๋ dp[111111] = power[j][i]๊ฐ ๋ ๊ฒ์ด๋ค.
์ฌ๊ท ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ ์ฐจ๋ก๋๋ก ํจ์๊ฐ ๋ฐํ๋๋ฉด์ ์์ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๊ณ dp[111101]๊ณผ dp[101101]์๋ ๊ฐ์ด ์ฑ์์ง๊ฒ ๋๋ค.
์ด์ ๋ค์ ์ฒ์ ์ํ๋ก ๋๋์์์ ์ด๋ฒ์๋ ์ผ์ชฝ ๋๋ฒ์งธ ๋ฐ์ ์๋ฅผ ๋จผ์ ํค๋ ๋ฐฉ์์ ํํ๊ฒ ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ผ์ชฝ ๋๋ฒ์งธ๋ฅผ ํจ ํ, ์ค๋ฅธ์ชฝ ์ธ๋ฒ์งธ ๋ฐ์ ์๋ฅผ ํค๊ฒ ๋๋ฉด ์๊น ์ด๋ฏธ ํ์ํ๋ dp[111101]์ ๋ค์ ์ง๋๊ฒ ๋๋ค. ์ด๋ฏธ dp[111101]์ ์ด๊ธฐํ ๊ฐ์ธ INF๊ฐ ์๋ ์๋ก์ด ๊ฐ์ผ๋ก ๊ฐฑ์ ๋์ด ์์ ๊ฒ์ด๋ค. ์ค๋ฅธ์ชฝ์์ ์ธ๋ฒ์งธ ๋ฐ์ ์๋ฅผ ๋จผ์ ํค๋ ๊ณผ์ ์์ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๊ณณ์ด๊ธฐ ๋๋ฌธ์ ๊ตณ์ด ๋ ๋ฒ ๋ฐฉ๋ฌธํ ํ์๋ ์๋ ๊ฒ์ด๋ค. ํ์ฌ๊น์ง ์ค๋ ๊ณผ์ ์ด ์ด๋ป๋ ๊ฐ์ ์๊ด์์ด ์์ผ๋ก 111101
์์ ๋ฐฉ๋ฌธํ๊ฒ ๋ ๊ฒฝ๋ก๋ ์ด์ ์ ๋ฏธ๋ฆฌ ์ง๋์จ ๊ฒฝ๋ก์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ๊ณผ์ ์์ dp๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
dp[cur]์ ์ ์ฅ๋ ๊ฐ์ด ์ด๊ธฐํ๋ ๊ฐ์ด ์๋๋ฉด ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๊ณณ์ด๋ฏ๋ก ํด๋น ๊ฐ์ ์ฌ์ฌ์ฉํ๊ณ return
์ด๋ dp๋ฐฐ์ด์ ๊ตณ์ด 2์ฐจ์์ผ ํ์๊ฐ ์๋๋ฐ ๊ฐ ๋นํธ๊ฐ์ด ๊ฐ์ง ์ ์๋ ์ผ์ผ ํ๋ ๋ฐ์ ์์ ๊ฐ์๋ ์ด๋ฏธ ๋ค ์ ํด์ ธ์๊ธฐ ๋๋ฌธ์ด๋ค. 101010์ ์ด๊ธฐ๊ฐ์ด๋ผ๊ณ ํ์๋ 111110์ ๋ฌด์กฐ๊ฑด 2๊ฐ๋ฅผ ์ผ์ผ ํ๊ณ , 111010์ ๋ฌด์กฐ๊ฑด ํ๊ฐ๋ฅผ ์ผ์ผ ํ๋ค.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int N;
static int P;
static int[][] power;
static int[] dp;
static final int INF = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
power = new int[N][N];
StringTokenizer st;
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
power[i][j] = Integer.parseInt(st.nextToken());
}
}
String powerState = br.readLine();
P = Integer.parseInt(br.readLine());
int curVar = 0;
int initCnt = 0;
for (int i = 0; i < N; i++) {
if (powerState.charAt(i) == 'Y') {
curVar |= (1 << i);
initCnt++;
}
}
dp = new int[1<<N];
Arrays.fill(dp, INF);
if (initCnt >= P) dp[curVar] = 0;
dfs(curVar, initCnt);
System.out.println(dp[curVar] == INF ? -1 : dp[curVar]);
// System.out.println(Arrays.toString(dp));
}
static int dfs(int cur, int cnt) {
if (cnt >= P) return 0;
if (dp[cur] != INF) return dp[cur];
for (int i = 0; i < N; i++) {
if ((cur & (1 << i)) != 0) continue; // ์ด๋ฏธ ์ผ์ง ๋ฐ์ ์๋ผ๋ฉด ์ง๋๊ฐ
for (int j = 0; j < N; j++) {
if ((cur & (1 << j)) == 0) continue; // ๊บผ์ง ๋ฐ์ ์๋ก๋ ๋ค๋ฅธ ๊บผ์ง ๋ฐ์ ์๋ฅผ ํฌ ์ ์์ผ๋ฏ๋ก ์ง๋๊ฐ
dp[cur] = Math.min(dp[cur], dfs(cur | (1 << i), cnt + 1) + power[j][i]);
}
}
return dp[cur];
}
}