c++(11)
-
[알고리즘/C++] 동적 계획법 - 엘리베이터 운행횟수
엘리베이터에는 한번에 탑승 가능한 무게 제한이 있다. 엘리베이터에 탑승하기 위한 승객들이 대기하고 있고, 무게 제한을 만족하면서 최소한의 운행 횟수로 승객들을 운반해야한다. 가장 작은 운행 횟수를 구하는 문제를 동적 계획법으로 해결해보자. vi weight = { 86, 58, 76, 102, 91 }; int lim = 200; input 값으로 승객들의 무게 데이터와 엘리베이터의 무게 제한이 주어진다. pair best[1
2023.07.29 -
[알고리즘/C++] Knapsack problem(배낭 문제)
배낭 문제는 특정 무게와 가치를 갖는 물건들이 주어질 때 배낭의 무게 제한을 만족하면서 가장 가치를 크게 하는 물건들의 조합을 찾는 전형적인 동적 계획법(Dynamic programming) 문제이다. int knapsack(vi weight, vi value, int limit) { vector ans(weight.size() + 1, vi(limit + 1, 0)); int row = weight.size(); int col = limit; weight.insert(weight.begin(), 0); value.insert(value.begin(), 0); //add sentinel value for (int i = 1; i
2023.07.29 -
[알고리즘/C++] 동적계획법 - 최대 값의 경로 찾기
2차원의 공간이 주어지고 각 인덱스의 공간마다 특정 값(Value)가 주어진다. 가장 상단 왼쪽의 격자부터 가장 하단 오른쪽의 격자로 이동하면서 경로 상의 값이 총합이 최대가 되도록 하는 알고리즘을 동적 계획법으로 풀어보자. 이동 조건은 오른쪽 혹은 아래 방향으로만 움직인다는 것이다. 1 2 1 2 0 1 3 4 5 6 1 2 3 5 1 위의 예시에서는 1 2 1 2 0 1 3 4 5 6 1 2 3 5 1 위의 경로로 이동하는 것이 최대값을 가진다. int maxSumRoute(vector arr) { vector sum(arr.size(), vi(arr[0].size(), 0)); for (int i = 0; i < arr.size(); i++) { for (int j = 0; j < arr[0].si..
2023.07.28 -
[알고리즘/C++] 최장증가부분수열구하기
최장증가 부분수열이란 수열이 주어졌을 때, 원소가 차례로 증가하는 부분 원소들을 말한다. 예를 들어 2 6 1 5 7 8 4 9 라는 수열이 있으면 증가하는 부분 배열의 예시들은 다음과 같다. 2 6 1 5 7 8 4 9 2 6 1 5 7 8 4 9 2 6 1 5 7 8 4 9 위의 3가지 예시에서 가장 길이가 긴 케이스는 1번과 2번 케이스로 5의 길이를 가진다. 가장 길이가 긴 케이스를 찾는 알고리즘을 동적 계획법으로 해결해보자. #include using namespace std; typedef vector vi; vi longestIncreasingSubseq(vi arr) { vi leng(arr.size(), 0); //벡터 초기화 for (int k = 0; k < arr.size(); k+..
2023.07.28 -
[알고리즘/C++] 병합 정렬(merge sort)
병합 정렬(merge sort)는 배열을 절반씩 쪼개서 재귀적인 방법으로 Sorting하는 알고리즘이다. void merge(vi& arr, int low, int mid, int high) { vi ans; int i = low; int j = mid + 1; while (i
2023.07.18