Algorithm/DP 52

BOJ#2293 동전1

BOJ#2293 동전1 * 문제https://www.acmicpc.net/problem/2293 * 풀이정말 이해하기 쉽지 않은 문제였습니다.조금 더 완벽하게 이해한 후에 저의 풀이를 포스팅하도록 하겠습니다. 참고한 풀이 : http://blog.naver.com/occidere/220784778900import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; /** * BOJ#2293 동전1 * https://www.acmicpc.net/problem/2293 */ public class Main { // dp[i] : n가지 종류의 동전..

Algorithm/DP 2017.01.24

BOJ#11066 파일 합치기 (Merging Files)

BOJ#11066 파일 합치기 (Merging Files) * 문제https://www.acmicpc.net/problem/11066 * 풀이 수열이 주어지고, 인접한 숫자는 합칠 수 있습니다. 합치는 비용은 두 수의 합이고, 전체 수를 합치는데 필요한 최소 비용을 구하는 문제입니다. ,동적계획법 (Dynamic Programming)을 이용합니다. 먼저 dp의 정의를 세워보면dp[i][j] : 수열에서 i번째~j번째 수까지 합치는데 필요한 최소 비용 ,따라서 아래와 같은 수열이 존재할 때null 40 30 30 50 위 정의에 따르면 자기 자신인 경우에는 합칠 수 없으므로dp[1][1] = 0, dp[2][2] = 0 ... 이 될 것입니다. 또한 인접한 수에 대해서는dp[1][2] = 70, dp[2..

Algorithm/DP 2016.12.23

BOJ#2011 암호코드

BOJ#2011 암호코드 * 문제https://www.acmicpc.net/problem/2011 * 풀이동적계획법(Dynamic Programming)을 이용합니다. 숫자의 범위가 1~26이므로어떤 해석할 수 있는 암호가 주어졌을 때, 마지막 숫자는 아래와 같이 3가지 경우로 나눌 수 있습니다. 그리고 아예 해석할 수 없는 경우도 있습니다. (dp[i] : i번째 숫자까지 해석했을 때, 해석의 가짓수)1) 한 자리수로만 해석할 수 있는 경우예 : "251" → 마지막 숫자 "1"은 "1"로 해석 가능하나, "51"로는 해석할 수 없다. 즉, "25"에서 "1"을 추가한 경우 dp[i] = dp[i-1]; 2) 두 자리수로만 해석할 수 있는 경우 예 : "2510" → 마지막 숫자 "0"은 "10"로 해..

Algorithm/DP 2016.12.12

BOJ#2225 합분해

BOJ#2225 합분해 * 문제https://www.acmicpc.net/problem/2225 * 풀이dynamic Programming 문제입니다. 예를 들어 2 2가 입력된 경우 아래와 같이 3가지 경우가 있을 수 있습니다.0 + 21 + 12 + 0 3 2가 입력된 경우에는0 + 31 + 22 + 13 + 0 4 2가 입력된 경우에는0 + 41 + 32 + 23 + 14 + 0 감이 오시나요?어떻게 풀어야 할지 모를때는 예제의 숫자를 낮춰서 생각하면 좋습니다. " N K가 입력된 경우에서첫번째 숫자가 m으로 정해지면나머지는 N-m K-1의 경우가 됩니다. " dp를 아래와 같이 정의하고 위 내용을 구현하시면 되겠습니다. - dp[N][K] : 0~N까지의 정수 K개를 더해서 그 합이 N이 되는 경..

Algorithm/DP 2016.12.09

BOJ#1699 제곱수의 합

BOJ#1699 제곱수의 합 * 문제https://www.acmicpc.net/problem/1699 * 풀이Dynamic Programming 문제입니다. 주의할 점으로,Greedy 하게 풀면 안됩니다. 반례로 12의 경우를 생각해보시면 되겠습니다.ex) 12 = 3^2 + 1^2 + 1^2 + 1^2 (4) = 2^2 + 2^2 + 2^2 (3) 따라서 동적계획법을 이용하면서 완전 탐색을 해주시면 됩니다. - 비슷한 문제 https://www.acmicpc.net/problem/1463 * 나의 코드https://github.com/stack07142/BOJ/tree/master/BOJ%231699_SumOfSquares

Algorithm/DP 2016.12.08

BOJ#11055 가장 큰 증가 부분 수열

BOJ#11055 가장 큰 증가 부분 수열 * 문제https://www.acmicpc.net/problem/11055 * 풀이 BOJ#11053 문제와는 조금 다른 문제입니다.11053 문제는 '증가하는 부분 수열' 중 가장 긴 수열의 길이를 구하는 것이었고,11055 문제는 '증가하는 부분 수열' 중 수열의 합이 가장 큰 것을 구하는 것입니다. 즉, 가장 긴 수열이 항상 가장 큰 합을 보장하지 않으므로dp를 11053 문제와는 다르게 설계하셔야 합니다. 11053의 dp[i]가 'A[i]를 포함하는 수열 중에, 길이가 가장 긴 수열의 길이' 였다면,11055의 dp[i]는 'A[i]를 포함하는 수열 중에, 수열의 합이 가장 큰 수열의 합' * 나의 코드https://github.com/stack0714..

Algorithm/DP 2016.12.07

BOJ#11053 가장 긴 증가하는 부분 수열 (LIS)

BOJ#11053 가장 긴 증가하는 부분 수열(LIS) * 문제https://www.acmicpc.net/problem/11053 * 풀이 유명한 문제인 Longest Increasing Subsequence (LIS)입니다.O(N^2) 방법과 O(N logN) 방법으로 풀어보았습니다. 기존에 워낙 설명이 잘 되어있어서 따로 포스팅 하지는 않겠습니다만,제가 공부할 때 참고했던 사이트 남겨드립니다. 1. LIS 이해 및 O(N^2) 풀이https://www.youtube.com/watch?v=CE2b_-XfVDk 위 동영상을 보시고 아래 저의 코드를 보시면 되겠습니다. * 나의 코드 // O(N^2) for (int i = 1; i < N; i++) { for (int j = 0; j < i; j++) {..

Algorithm/DP 2016.12.06

BOJ#2156 포도주 시식

BOJ#2156 포도주 시식 * 문제https://www.acmicpc.net/problem/2156 * 풀이동적계획법(Dynamic Programming)을 이용해봅시다. 일단 아래와 같이 배열을 선언합니다.dp[n] : n잔 째 마셨을 때, 최대로 마실 수 있는 포도주의 양p[n] : 포도주 n번 째 잔에 들어있는 포도주의 양 포도주는 3번 연속해서 마실 수 없으므로,n번 째 (마지막) 포도주는 3가지 경우로 나눌 수 있습니다.마시지 않는 경우, 1잔 째 마신 경우, 2잔 째 마신 경우 우리가 구하려는 dp[n]을 구해봅시다.1) 마지막 n번 째 포도주 잔 - 마시지 않는 경우 : n-1번 째 잔은 다시 1, 2, 3번의 경우로 나누어 질 수 있습니다. : dp[n] = dp[n-1] 2) 마지막 n..

Algorithm/DP 2016.11.25

BOJ#9465 스티커

BOJ#9465 스티커 * 문제 https://www.acmicpc.net/problem/9465 * 풀이 동적계획법(Dynamic Programming) 문제입니다. 최종적으로 점화식을 구해야 문제를 풀 수 있습니다. 0) 자료구조- 각 스티커의 점수를 저장하는 2차원 int 배열 : cost - 0열에서 출발하여 해당 위치까지의 점수의 합을 저장하는 2차원 int 배열 : dp 1) 시작점 생각하기0열에서 시작한다고 생각해봅시다. 시작점은 (0, 0), (0, 1)으로 2개가 됩니다. 2) 다음 스티커 선택하기(0, 0)에서 시작할 경우 (1, 1), (1, 2) 스티커를 선택할 수 있습니다. 그리고 (1, 1)과 (1, 2) 중에서 큰 값을 선택하면 됩니다. 한편, (0, 0)에서 (0, 2), (..

Algorithm/DP 2016.11.24

BOJ#10844 쉬운 계단 수

BOJ#10844 쉬운 계단 수 * 문제https://www.acmicpc.net/problem/10844 * 풀이동적계획법(Dynamic Programming)을 이용합니다.일단 점화식을 만들어야 하는데.. 저에게는 꽤 어려운 문제였습니다. dp[N] : 길이가 N인 계단 수의 개수 → 인접한 자리수의 차이가 1이라는 조건을 이용할 수 없으므로 아래와 같이 점화식을 구성합니다. dp[N][L] : 길이가 N이면서 마지막 수가 L인 계단 수의 개수 → 마지막 수가 L이므로 앞자리 수는 L-1, L+1이 될 수 있다. → dp[N][L] = dp[N-1][L-1] + dp[N-1][L+1] public class Main { // dp[N][L] : 길이가 L이고 마지막 수가 L인 계단 수 // dp[N]..

Algorithm/DP 2016.11.22