※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 1727번 문제인 커플 만들기이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/1727
남자와 여자를 이어줄 때 둘의 성격의 차이를 "비용"이라 부르겠다.
먼저 남자들과 여자들의 성격수치를 각각 오름차순으로 정렬하자. 이때,
위 관찰을 이용하면,
아래는 제출한 소스코드이다.
#include <iostream>
#include <algorithm>
using namespace std;
int N, M;
int mn[1001][1001], dp[1001][1001]; bool mvisited[1001][1001], visited[1001][1001];// [N][M]이 마지막 매칭인 최솟값
int A[1001], B[1001];
int func(int n, int m);
int mnfunc(int n, int m) {
if (n < m) return 0x3f3f3f3f;
if (!m) return 0;
int &ret = mn[n][m];
if (mvisited[n][m]) return ret;
mvisited[n][m] = 1;
ret = func(n, m);
ret = min(ret, mnfunc(n - 1, m));
return ret;
}
int func(int n, int m) {
int &ret = dp[n][m];
if (visited[n][m]) return dp[n][m];
visited[n][m] = 1;
ret = mnfunc(n - 1, m - 1) + abs(A[n] - B[m]);
return ret;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M;
for (int i = 1; i <= N; i++) cin >> A[i];
sort(A + 1, A + N + 1);
for (int j = 1; j <= M; j++) cin >> B[j];
sort(B + 1, B + M + 1);
if (N < M) swap(N, M), swap(A, B);
cout << mnfunc(N, M);
}
처음 이 문제를 접근할 때의 글쓴이가 했던 생각을 같이 남겨둔다.
글쓴이는 처음에 이 문제를 성격수치가
헝가리안 알고리즘(Hungarian algorithm; Kuhn-Munkres Algorithm)은 구현해본 적이 없어 확인하지 않았는데 (안될 것 같지만) 이걸로도 풀릴까...?
BOJ Random Defense #10 (실패: 제한시간초과)
'BOJ' 카테고리의 다른 글
[BOJ 23000 // C++] L Shaped Plots (0) | 2024.06.01 |
---|---|
[BOJ 9911 // C++] ERP (0) | 2024.05.31 |
[BOJ 22887 // C++] Reversort Engineering (0) | 2024.05.29 |
[BOJ 9176 // C++] 메르센 합성수 (0) | 2024.05.28 |
[BOJ 7146 // C++] 데이터 만들기 7 (0) | 2024.05.27 |