2. Introduction Dynamic Programming(DP) 는 점화식과 초기 상태를 기반으로 하는 알고리즘 기술이다. DP는 이전 상태에서 구해두었던 결과값으로 다음 상태의 최적 값을 구하는 방법이다. DP는 수학적 사고 능력을 갖추었는지를 확인하기 위한 좋은 문제이므로, 대회에 많이 나오는 유형이다.
3. 동전 교환 문제 (V1, V2, ... , VN) 값을 가지는 동전이 있을 때 S원을 만드는 최소의 동전개수를 구하는 문제. 예를 들어, {1, 4, 6} 원의 동전이 있을 때, 8원을 거슬러 주는 최소 동전 개수는 2개이다. 보통 큰 동전부터 채워 넣으면 된다고 생각하기 쉽지만, 이 경우에는 6원, 1원, 1원으로 3개가 되므로 최적의 답이 아니다. ( greedy )
4. 동전 교환 문제 DP의 첫 번째(전통적인) 방법; 초기 상태 - 0원은 0개로 만든다. k원을 만들기 위해서, 마지막으로 j번째 동전을 사용한다고 하면 k-Vj원을 만드는 최소 동전의 개수에 1을 더한 개수로 k원을 만들 수 있다. 따라서 수학적 귀납법처럼, 0원을 알고, 1원의 최적을 구하고, 2원의 최적을 구하고, 계속 구해 나가면 S원을 구하는 최적 역시 구할 수 있다.
6. 동전 교환 문제 DP의 두 번째 방법; 처음에 0원 만큼 만든 상태라고 하자. S원을 만들기 위해서, 0원 에서 할 수 있는 선택은 0번 동전을 1개 쓰거나, 1번 동전을 1개 쓰거나… 이다. 각각의 선택에서 지금까지 알려진 최소의 동전 개수보다 작으면 값을 갱신한다. k원을 고려할 때, k-1원까지는 결정된 최소의 값이므로 이전의 값에 대해서는 고려하지 않아도 된다. 답의 갱신 방향을 바꾸는 방법: 이 문제의 경우는 별 차이가 없으나, 문제에 따라 큰 차이
8. Longest Increasing Subsequence N개의 숫자의 sequence가 다음과 같이 주어진다. (A[1] , A[2] , ..., A[N])주어진 sequence에서 감소하지 않는 가장 긴 sequence의 길이를 구하여라. 이 때 sequence의 원소는 연속하지 않은 것이어도 된다. 예를 들어, (5, 3, 4, 8, 6, 7) 의 값이 들어온다고 할 때, LIS는(3, 4, 6, 7)이고, 길이는 4이다.
9. Longest Increasing Subsequence 초기상태 – 첫 번째 원소의 LIS 길이는 1이다. k번째 원소를 j번째 원소(j<k, A[j] < A[k]) 뒤에 이어 붙여서 IS를 만든다고 할 때, 길이는 j번째 원소를 마지막으로 하는 IS의 길이에 1을 더한 값이다. 결국 k번째 원소를 어디에 이어 붙여야 가장 긴 Increasing Subsequence를 만들 수 있는 지에 대해서 생각해 보면 된다. k 번째 다음 원소들에 대해서는 지금 생각할 필요가 없다.
11. 사과 문제 N*M 개의 칸이 있는 테이블이 있고, 사과가 몇 개 테이블 위에 있다. 맨 위왼쪽 칸에서 시작하여 맨 아래 오른쪽 칸까지 도착해야 한다. 오른쪽이나 아래쪽으로밖에 이동할 수 없다고 했을 때, 사과를 가장 많이 먹으면서 목적지까지 이동하면 최대 몇 개의 사과를 먹을 수 있겠는가?
12. 사과 문제 초기 상태 – (0,0) 칸에서는 A[0][0](0혹은 1)개 이다. (k, j) 칸으로는 (k-1, j) 칸에서 오른쪽으로 이동하거나 (k, j-1) 칸에서 아래쪽으로 이동하는 두 가지의 방법으로 갈 수 있다. 두 가지 방법 중에 사과가 많은 쪽을 선택하면 된다.