728x90
0. [c++] 백준 |
https://www.acmicpc.net/problem/2618
1. 풀이 |
처음은 메모이제이션을 활용한 dp를 통해 최단 거리를 찾고, 두번째 findOrder은 dp와 설계는 동일하지만, 방문의 순서만 찾는 설계를 해서 order를 찾도록 만들어주었다.
2. 소스코드 |
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | //brute force를 활용한 풀이 //#include<iostream> //#include<queue> //#include<vector> // //using namespace std; // //int N, W; //const int INF = 1000000007; //vector<pair<int, int>> qu; // //int dp(pair<int, int> car1 = { 1,1 }, pair<int, int> car2 = { 6,6 }, int count = 0) { // if (count == W) // return 0; // int ret = INF; // ret = min(ret, (abs(car1.first - qu[count].first) + abs(car1.second - qu[count].second) + dp(qu[count], car2, count + 1))); // ret = min(ret, (abs(car2.first - qu[count].first) + abs(car2.second - qu[count].second) + dp(car1, qu[count], count + 1))); // // return ret; //} // //int main() { // ios_base::sync_with_stdio(0); // cin.tie(0); // // cin >> N >> W; // int x,y; // for (int i = 0; i < W; i++) { // cin >> x >> y; // qu.push_back({ x,y }); // } // // cout << dp() << endl; // // // return 0; //} //brute force를 활용한 풀이 #include<iostream> #include<queue> #include<vector> using namespace std; int N, W; const int INF = 100000007; vector<pair<int, int>> qu; queue<int> order; int cache[1001][1001]; int dp(int order1 = 0, int order2 = 0) { int here = max(order1, order2); int next = here + 1; if (next == qu.size()) return 0; int& ret = cache[order1][order2]; if (ret != -1) return ret; ret = INF; pair<int, int> car1; pair<int, int> car2; if (order1 == 0) { car1 = { 1,1 }; } else { car1 = qu[order1]; } if (order2 == 0) { car2 = { N,N }; } else { car2 = qu[order2]; } ret = min(ret, (abs(car1.first - qu[next].first) + abs(car1.second - qu[next].second) + dp(next, order2))); ret = min(ret, (abs(car2.first - qu[next].first) + abs(car2.second - qu[next].second) + dp(order1, next))); return ret; } void findOrder(int order1 = 0, int order2 = 0) { int here = max(order1, order2); int next = here + 1; if (next == qu.size()) return; pair<int, int> car1; pair<int, int> car2; if (order1 == 0) { car1 = { 1,1 }; } else { car1 = qu[order1]; } if (order2 == 0) { car2 = { N,N }; } else { car2 = qu[order2]; } int a = (abs(car1.first - qu[next].first) + abs(car1.second - qu[next].second) + dp(next, order2)); int b = (abs(car2.first - qu[next].first) + abs(car2.second - qu[next].second) + dp(order1, next)); if (a < b) { order.push(1); findOrder(next, order2); } else { order.push(2); findOrder(order1, next); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> N >> W; int x,y; qu.push_back({ 0,0 }); for (int i = 0; i < W; i++) { cin >> x >> y; qu.push_back({ x,y }); } //초기화를 해주자. for (int i = 0; i < W; i++) { for (int j = 0; j < W; j++) { cache[i][j] = -1; } } cout << dp() << endl; findOrder(); while (!order.empty()) { cout << order.front() << endl; order.pop(); } //for (int i = 0; i < N; i++) { // for (int j = 0; j < N; j++) { // if(cache[i][j] != -1) // cout << "i : " << i <<" j : " << j << " " << cache[i][j] << endl; // } //} return 0; } | cs |
3. 참고 |
질문이나 지적 있으시면 댓글로 남겨주세요~
도움 되셨으면 하트 꾹!
'<백준> > |c++| normal' 카테고리의 다른 글
[c++]백준 1315 - RPG(메모이제이션, dp) (0) | 2019.07.12 |
---|---|
[c++]백준 11062 - 카드 게임(dp, 메모이제이션) (0) | 2019.07.12 |
[c++] 백준 2957 - 이진 탐색 트리(map활용, 이후에 다시) (0) | 2019.07.05 |
[c++] 백준 1300 - K번째 수(이진 탐색) (0) | 2019.07.04 |
[c++] 백준 1654 - 랜선 자르기(이진 탐색) (0) | 2019.07.04 |