๊ณจ๋1 : ๋์ ๊ณํ๋ฒ ๋ฌธ์ ์ด๋ค.
์๊ฐ
dp์ ์ ์๋ ๊ฐ๋จํ๊ฒ ์๊ฐํ ์ ์๋ค. ํน์ ํ ์ํ์ ๋ฐ์ ์๋ก ์ค๋ ๋ฐฉ๋ฒ์ ๋ช๊ฐ์ง๋ก ์ ํด์ง๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ์ ์๋ฅผ ์ก์ผ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์ ์
dp[์ํ]
= ๋ฐ์ ์์ ์ํ์์์ ๋ฐ์ ์๋ฅผ ๊ณ ์น๋๋ฐ ๋ฐ์ํ๋ ๋น์ฉ์ ์ต์๊ฐ
๊ทธ๋ ๋ค๋ฉด ์ํ๋ ์ด๋ป๊ฒ ์ ์ํ ์ ์์๊น?
๋นํธ๋ง์คํฌ
YNN์ 100์ผ๋ก ์๊ฐํ ์ ์๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด ์ํ์์ ๋ค์์ํ๋ก๋ ์ด๋ป๊ฒ ๊ฐ ์ ์์๊น?
- ์ผ์ ธ์๋ ๋ฐ์ ์๋ฅผ ํ์ธํ๋ค.
- ํด๋น ๋ฐ์ ์์์ ๊บผ์ ธ์๋ ๋ฐ์ ์๋ฅผ ํ์ธํ๋ค.
- ๊บผ์ ธ์๋ ๋ฐ์ ์๋ฅผ ํจ๋ค.
- ๋ค๋ฅธ ์ํ์์ ๋ ๊ฐ์ ์ํ๋ก ์ฌ ๋, ์ต์๊ฐ์ผ๋ก ์ ๋ฐ์ดํธ ํ๋ค.
์ฃผ์ํ ์
์ด๊ธฐ๊ฐ์ ๋ชจ๋ -1๋ก ๋ง๋ ์ํ์์ ๊ฐ์ ์ถ๋ ฅํ๋ ๊ฒ์ด ์ข๋ค. ๋ง๋ค์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํจ์ด๋ค. ๋ํ 0๊ฐ์ ๋ฐ์ ์๋ฅผ ํค๋ผ๋ ์กฐ๊ฑด์์ -1์ ๋ฆฌํดํ๋ฉด ์๋๊ณ 0์ ๋ฆฌํดํด์ผ ํ๋ค.
Code
#include<iostream>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int N;
int a[17][17];
string str;
int dp[1<<16];
int p;
int main(){
cin >> N;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> a[i][j];
}
}
int start = 0;
for (int i = 0; i < N; i++) {
char temp;
cin >> temp;
if (temp == 'Y') start += (1<<i); // YNN -> 001๋ก ์ ์ฅํ๋ค. ์ด์ง์์ shift์ฐ์ฐ ์ค์๋ ์ด๊ฒ ํธํ๋ค.
}
cin >> p;
// ๊ธฐ๋ณธ dp์ ๊ฐ์ -1๋ก ํด๋๋ค.
// ์ผ๋จ ๋ค ๋ชป ๋ง๋ ๋ค๊ณ ๊ฐ์ ํ๋ ๊ฒ
memset(dp, -1, sizeof(dp));
dp[start] = 0; // start์์ dp๊ฐ์ 0์ด๋ค. ์ต์๊ฐ์ด 0
for (int i = 0; i < (1<<N); i++) {
if (dp[i] == -1) continue; // ์ํ์ ๋ํ ์ต์๊ฐ์ด ์๋ค๋ฉด ์งํํ ์ ์๋ค.
for (int j = 0; j < N; j++) { // ๋ฐ์ ์๋ฅผ ์์ฐจ์ ์ผ๋ก ์ฒดํฌํ๋ฉฐ ๋ค์ ์ํ๋ฅผ ๋ง๋ ๋ค.
if (i&(1<<j)){ // ํ์ฌ ๋ฐ์ ์์ ์ํ์ค j๋ฒ์งธ ๋ฐ์ ์๊ฐ ์๋ค๋ฉด
for (int k = 0; k < N; k++) {
if ((i&(1<<k)) == 0){ // ํ์ฌ ๋ฐ์ ์์ ์ํ์์ j๋ฒ์งธ ๋ฐ์ ์๋ฅผ ๊ฐ์ง๊ณ k์์น์ ๋ฐ์ ์๋ฅผ ํค๋ ค๊ณ ํ ๋ k์์น ๋ฐ์ ์๊ฐ ๊บผ์ ธ์๋ค๋ฉด
if (dp[i|(1<<k)] == -1 || dp[i|(1<<k)] > dp[i] + a[j][k]) {
dp[i|(1<<k)] = dp[i]+a[j][k];
}
}
}
}
}
}
int ans = -1;
for (int i = 0; i < (1<<N); i++) {
if (dp[i] == -1) continue;
int count = 0;
for (int j = 0; j < N; j++) {
if (i&(1<<j)) count++;
}
if (count >= p) {
if (ans == -1 || ans > dp[i]) ans = dp[i]; // ans๋ฅผ -1๋ก ํ๊ธฐ ๋๋ฌธ์ ์ฒ์์ scope๋ค์ด์ค๊ธฐ ์ํด ์กฐ๊ฑด ์ถ๊ฐ
}
}
cout << ans << '\n';
}