Dynamic Programming 11

[백준 - Python] 17404 - RGB 거리 2

0. 문제 링크 https://www.acmicpc.net/problem/17404 17404번: RGB거리 2 첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 www.acmicpc.net 1. 풀이 방법 일단 문제를 보자마자 이건 DP라는 생각이 들었다. 가장 문제는 마지막 집과 첫 번째 집의 색이 달라야 한다는 것이다. 사실 마지막 집과 첫 번째 집의 색을 고려하지 않고 짰는데, 알고 보니 고려해야 해서 조금 수정을 했다. 그러면 고려를 한다면 어떻게 해야할까? 많은 고민을 했다. 누가 봐도 DP인데, 어떻게 첫 번째 집의 정보를 저장..

[백준 - Python] 14267 - 회사 문화 1

0. 문제 링크 https://www.acmicpc.net/problem/14267 14267번: 회사 문화 1 영선회사에는 매우 좋은 문화가 있는데, 바로 상사가 직속 부하를 칭찬하면 그 부하가 부하의 직속 부하를 연쇄적으로 칭찬하는 내리 칭찬이 있다. 즉, 상사가 한 직속 부하를 칭찬하면 그 부하 www.acmicpc.net 1. 풀이 방법 1번 시도(트리라 생각함) 1. defaultDict을 이용해서 자신의 직속 후임을 리스트로 만들어놓음 2. 그리고 우선 자신에게 칭찬을 더하고, 후임들을 또 재귀함 3. 재귀 제한에 걸려서, 다시 수정하고 제출하니 이번엔 시간 초과 2번 시도(트리에 BFS를 적용함) 1. 재귀 때문에 시간 초과라 생각함 2. 그래서 재귀를 bfs로 변경해서 구현함 3. 시간 초..

[백준 - Python] 11048 - 이동하기

0. 문제 링크 https://www.acmicpc.net/problem/11048 11048번: 이동하기 준규는 N×M 크기의 미로에 갇혀있다. 미로는 1×1크기의 방으로 나누어져 있고, 각 방에는 사탕이 놓여져 있다. 미로의 가장 왼쪽 윗 방은 (1, 1)이고, 가장 오른쪽 아랫 방은 (N, M)이다. 준규는 www.acmicpc.net 1. 풀이 방법 그냥 전형적인 DP 문제이다. 보통 DP는 점화식만 잘 세우면 끝인데, 이 문제도 그렇다. dp 변수는 1부터 시작하지만, 사탕이 들어있는 맵인 board는 0부터 시작한다. 이거는 맞춰주면 된다. 참고로 대각선으로는 갈 필요가 없다. 왜냐하면 오른쪽 -> 아래로 가는 것이 대각선으로 가는 것인데, 이 방법이 대각선으로 직통으로 가는 것보다 훨씬 사탕..

[알고리즘 - 이론] The Traveling Salesperson Problem : TSP (외판원 문제)

앞의 글을 읽으시면 이해에 도움이 됩니다. 2022.04.13 - [Computer Science/알고리즘] - [알고리즘] 동적 계획법 (Dynamic Programming) [알고리즘] 동적 계획법 (Dynamic Programming) 1. 동적 계획법이란? DP (Dynamic Programming)는 코딩 테스트의 절반 이상을 차지하는 알고리즘이라 봐도 무방합니다. DP는 분할 정복과 매우 유사합니다. 하지만 분할 정복은 top-down 방식을 이용하고, D hi-guten-tag.tistory.com 2022.05.27 - [Computer Science/알고리즘] - [알고리즘 - 이론] Branch-and-Bound Strategy (분기한정법) [알고리즘 - 이론] Branch-and-B..

[알고리즘] 동적 계획법 - 최적 이진 검색 트리 (Dynamic Programming - Optimal Binary Search Tree)

1. BST (Binary Search Tree)란? 아마 자료구조 시간에 다 배웠으실 텐데요. BST는 ordered set (순서 가능한 집합)에 속한 원소(key)로 이루어진 이진 트리이고, 다음의 조건을 만족합니다. 각각의 노드는 하나의 unique한 key를 갖고 있다. node의 left subtree는 node의 key보다 작거나 같다. node의 right subtree는 node의 key보다 크거나 같다. 생각보다 간단하죠? 우리의 목적은 BST에서 검색하는 key와 같은 원소를 찾는 average time을 최소화하는 데 있습니다. 만약에 각 원소가 검색될 확률이 모두 동일하다면, 트리의 높이는 낮을 수록, 그리고 좌우의 높이 차가 덜 클수록 효율적입니다. 하지만 만약에 각 원소가 검색..

[알고리즘] 동적 계획법 - 연쇄 행렬곱셈 (Chained Matrix Multiplication)

우선 2x3 행렬과 3x4 행렬을 곱해봅시다. 결과물은 2x4 행렬이 나오겠죠? 또한 곱셈의 횟수는 2 x 3 x 4 = 24입니다. 즉 i x j 행렬과 j x k행렬의 곱의 횟수는 i x j x k가 됩니다. 또 다른 예시를 들어봅시다. A X B X C X D이고, A = 20 x 2, B = 2 x 30, C = 30 x 12, D = 12 x 8입니다. 행렬 곱셈은 결합 법칙이 성립하므로, 곱셈의 순서는 결과에 영향을 미치지 않습니다. 즉, (AB)(CD) = (A(B(CD))와 같습니다. 이때 4개의 행렬은 총 5개의 다른 순서로 곱할 수 있습니다. A(B(CD)) : 3680 A((BC)D) : 1232 (AB)(CD) : 8880 ((AB)C)D : 10320 (A(BC))D : 3120 ..

[알고리즘] 동적 계획법과 최적화 문제 (Dynamic Programming and Optimization Problem)

1. DP의 개발절차 1. 최적의 해답을 주는 재귀 관계식을 세운다. -> Divide and Conquer를 해본다. 2. bottom-up 방식으로 최적 해를 찾는 계산한다. 3. bottom-up 방식으로 최적 해를 구축한다. 보통은 2번과 3번이 동시에 이루어집니다. 만약 답만 구하고 최적화를 하지 않는다면, 3번이 빠져있는 것입니다. 최적화 문제를 모두 DP로 풀 수 있는 것이 아닙니다. 문제에 최적의 원칙이 반드시 성립해야합니다. 최적의 원칙은 다음과 같습니다. The Principle of Optimality if an optimal solution to an instance of a problem always contains optimal solutions to all subinstance..

[알고리즘] 동적 계획법 - 삼각형 위의 최대 경로 최적화 코드 (Dynamic Programming - Maximum path above the Triangle, Optimization Code)

from os import sep import sys from copy import deepcopy input = sys.stdin.readline def func(T, P, n): # 최대 경로를 찾는 함수 # T[i][j]는 T[i-1][j-1]과 T[i-1][j]중에 큰 값을 고르면 된다. for i in range(1, n): for j in range(i + 1): k = max(T[i-1][j-1], T[i-1][j]) T[i][j] += k if k == T[i-1][j]: P[i][j] = 2 else: P[i][j] = 1 def path(T, P, i, j, p): # 경로를 찾는 함수 if i > 0: k = P[i][j] if k == 2: path(T, P, i-1, j, p) #..