๐ค๋ฌธ์ ์ดํด
๋ชจ๋ ๋์๋ฅผ ๊ฑฐ์น๊ณ ๋ค์ ์ฒ์ ๋์๋ก ๋์์ค๋ ๋ชจ๋ ๊ฒฝ๋ก ์ค ๋น์ฉ์ด ๊ฐ์ฅ ์ ๊ฒ ๋๋ ๊ฒฝ๋ก์ ๋น์ฉ์ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
๐ก์ฒซ๋ฒ์งธ ์์ด๋์ด
๊ทธ๋ฅ ์์ด์ ๊ตฌํด์ ํ๋ฉด ์ต๋ 16! =20,922,789,888,000์ผ๋ก 1์ด ์์ ์ ๋ ํ ์ ์๋ค.
์ด ๋ฌธ์ ๋ 1์ฃผ์ฐจ ์คํฐ๋์์ ๋ฐฐ์ด ๋นํธ๋ง์คํน์ ๋ํ ๋ฌธ์ ์๊ณ , ๋ฌธ์ ํ์ด ๋ฐฉ์์ ๊ฑฐ์ ๋ค ๋ฐฐ์ ์ด์ DP์ ๋นํธ๋ง์คํน์ผ๋ก ๋ฐ๋ก ํ ์ ์์๋ค.
๋ฌผ๋ก DP ๋์ ๋ฐฉ์์ ์ดํดํ๊ธฐ ์ํด ์๊ฐ์ด ์กฐ๊ธ ๊ฑธ๋ฆฌ๊ธด ํ๋ค.
๐ฅํ์ด๐ฅ
dp[i][j]๋ ํ์ฌ ์์น i์ ํ์ฌ๊น์ง ๋ฐฉ๋ฌธํ๋ ์ ์ ๋ค์ ์ ๋ณด๋ฅผ ๋ด์ j ๊ฐ์ผ ๋, ์์ผ๋ก ํ์ํ ์ํ ๋น์ฉ์ ์ต์๊ฐ์ ์๋ฏธํ๋ค.
j๊ฐ (1 << ์ ์ ์ ๊ฐ์) -1๊ณผ ๊ฐ์ผ๋ฉด ํ์ฌ ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
๊ฐ ์ ์ ์ ๋ํด ์ ๋ถ ๋ฐฉ๋ฌธํ์ ๋์ ์ต์๊ฐ์ ์ฐพ์ผ๋ฉด ๋๋ฏ๋ก ์ ๋ต์ dp[์ฒ์ ์ ์ ][1]์ด๋ค.
์๋๋ ์ ์ถํ ์ฝ๋์ด๋ค.
#include <iostream>
#include <cmath>
using namespace std;
#define MAX 1000000000;
int dp[17][65537];
int w[17][17];
int n;
int solve(int cur, int visit) {
if (visit == (1 << n) - 1 && w[cur][0])
return w[cur][0];
if (dp[cur][visit]) return dp[cur][visit];
dp[cur][visit] = MAX;
for (int i = 1; i < n; i++) {
if (visit & (1 << i)) continue;
if (!w[cur][i]) continue;
dp[cur][visit] = min(dp[cur][visit], solve(i, visit | (1 << i)) + w[cur][i]);
}
return dp[cur][visit];
}
int main() {
cin.tie(NULL);
ios::sync_with_stdio(false);
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> w[i][j];
}
}
cout << solve(0, 1);
}
'๋ฐฑ์ค > C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/C++] 1162๋ฒ ๋๋กํฌ์ฅ (0) | 2022.07.16 |
---|---|
[๋ฐฑ์ค/C++] 1005๋ฒ ACM Craft (0) | 2022.07.16 |
[๋ฐฑ์ค/C++] 1753๋ฒ ์ต๋จ๊ฒฝ๋ก (0) | 2022.07.15 |
[๋ฐฑ์ค/C++] 14888๋ฒ ์ฐ์ฐ์ ๋ผ์๋ฃ๊ธฐ (0) | 2022.07.13 |
[๋ฐฑ์ค/C++] 1790๋ฒ ์ ์ด์ด ์ฐ๊ธฐ 2 (0) | 2022.07.11 |