문제
https://www.acmicpc.net/problem/2098
해설
단순히 모든 곳을 방문하는 문제면 간단 dp문제 이지만 순회를 해야하는 조건이 조금 까다로움
순회를 확인하기 위해 비트마스킹 사용
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
const int INF = 987654321;
int n,start[20],end[20],s,e,cost, dp[20][1<<(16)],mp[20][20];
vector<tuple<int,int,int>> v;
vector<vector<int>> v_list;
int go(int start,int visited){
if(visited == (1<<n)-1){
return mp[start][0] ? mp[start][0] : INF;
}
int &ret = dp[start][visited];
if(ret != -1) return ret;
ret = INF;
for(int i = 0;i<n;i++){
if(visited & (1<<i)) continue;
if(mp[start][i]== 0) continue;
ret = min(ret,go(i,visited | (1<<i)) + mp[start][i]);
}
return ret;
}
int main(){
cin >> n;
for(int i=0; i< n; i++){
for(int j=0;j<n;j++){
cin >> cost;
mp[i][j] = cost;
}
}
memset(dp,-1,sizeof(dp));
cout << go(0,1);
}
|
cs |
'백준 알고리즘(C++)' 카테고리의 다른 글
백준 1103번 게임 ( C++ ) (0) | 2024.09.15 |
---|---|
백준 17070번 파이프 옮기기 1 ( C++ ) (0) | 2024.09.15 |
백준 1072번 게임 ( C++ ) (0) | 2024.09.11 |
백준 16434번 드래곤 앤 던전 ( C++ ) (0) | 2024.09.10 |
백준 1269번 대칭 차집합 ( C++ ) (0) | 2024.09.10 |