본문 바로가기

Algorithm/Dynamic Programming

(12)
[백준] 4781번 사탕 가게 문제 주소 : https://www.acmicpc.net/problem/4781 1. Approach (1) 다이나믹 프로그래밍으로 접근한다. -> 이유는 사탕의 종류가 최대 5000개, 소유한 돈 100원, 사탕이 개당 0.01원 이라면 i) 현재 사탕을 선택하는 경우 ii) 현재 노드를 선택하지 않는 경우 -> 1번 사탕을 선택하고 다음 차례에 1번 사탕을 다시 선택할 수 있으므로, 중복을 포함한 5000개의 사탕을 총 10000번 선택하게 되면 시간초과가 발생하게 된다. (2) DP 배열 정의 -> DP[money] : 돈 money로 살 수 있는 사탕의 최대 칼로리 (3) 돈을 소수점 둘째자리까지 받으므로, 100을 곱해서 int형으로 바꾼다음 문제를 풀어나간다. 2. Source Code #in..
[백준] 2213번 트리의 독립집합 문제 주소 : https://www.acmicpc.net/problem/2213 1. Approach (1) 다이나믹 프로그래밍으로 접근한다. ( 동작 방식을 같이 생각해야지 시간 초과의 여부를 알 수 있다 ) -> 이유는 트리의 노드가 최대 10,000개 이므로, i) 현재 노드를 선택하는 경우 -> 간선으로 이어져 있는 노드는 선택할 수 없다. ii) 현재 노드를 선택하지 않는 경우 -> 간선으로 이어져 있는 노드를 선택하지 않는 경우, 이어져 있는 노드를 선택하는 경우로 나뉜다. 총 3가지이고, 간단하게 모든 노드 10,000 개에 대해서 위 연산을 실행한다면, 약 3^10000 번의 연산을 하게 될 수가 있다. 즉, 시간 초과가 발생한다. (2) DP 배열 정의 -> DP[idx][2] : idx..
[백준] 9095번 1,2,3 더하기 문제 주소 : https://www.acmicpc.net/problem/9095 1. Approach (1) 다이나믹 프로그래밍으로 접근한다. -> 이유는 ( 3^10​ + 3^9 + ... + 3^1) 의 계산을 하게 되면, 시간 초과가 발생한다. (2) 동작 방식 ​ - num을 n부터 1, 2, 3으로 빼면서 함수를 실행시켜나간다. - 0에 도착하는 경우의 모든 수를 세야 한다. - num - 1, num - 2, num - 3을 하는 경우가 있으므로 이 3 경우를 전부 합쳐주면 된다. ​ (3) 다이나믹 프로그래밍은 대부분 결과 출력값 = 메모이제이션 테이블 = 함수반환 값이다. 즉, 재귀 함수를 호출할 때 넘겨주는 그 매개변수 값이 함수(num - 1)의 의미는 num - 1의 숫자를 1, 2,..
[백준] 1463번 1로 만들기 출처 : https://www.acmicpc.net/problem/1463 1. Approach (1) 다이나믹 프로그래밍으로 접근한다. -> 이유는 메모이제이션을 하지 않는다면, Top-down 방식 (재귀함수)로 풀었을 때 n / 3, n / 2, n - 1로 3 경우의 모든 경우를 다해본다면 N이 10^6 일 때 (3^10)^6의 시간이 걸릴 수가 있다. ​ (2) 다이나믹 프로그래밍을 처음 접하신 분들이라면 이 문제를 통해서 메모이제이션의 필요성, 동작 방식을 정확히 이해했으면 한다. ​ (3) 아래 그림은 n이 10일 때 함수 동작 방식에 대한 설명이다. -> 위 그래프에서 10부터 1까지의 간선의 개수가 연산 횟수와 같다. 2. Source Code #include #include #inclu..