DynamicProgramming 32

[백준 2156번] 포도주 시식

n = int(input()) weight = [0]*10000 dp = [0]*10000 for i in range(n): weight[i] = int(input()) dp[0] = weight[0] dp[1] = weight[0] + weight[1] dp[2] = max(weight[2]+weight[0], weight[2]+weight[1], dp[1]) for i in range(3,n): dp[i]=max(weight[i]+dp[i-2], weight[i]+weight[i-1]+dp[i-3],dp[i-1]) print(max(dp)) 이번 문제는 이전에 풀었던 '2579번 - 계단 오르기' 문제와 유사한 문제로, 연속 3개의 포도주를 마시지 못한다는 조건 하에 최대로 마실 수 있는 포도주의 양..

Algorithm/DP 2023.03.08

[백준 12865번] 평범한 배낭

n, k = map(int,input().split()) list = [(0,0)] for i in range(n): list.append(tuple(map(int,input().split()))) dp = [[0] * (k+1) for _ in range(n+1)] for i in range(1,n+1): for j in range(1, k+1): w = list[i][0] v = list[i][1] if j < w: dp[i][j] = dp[i-1][j] else: dp[i][j] = max(dp[i-1][j-w] + v,dp[i-1][j] ) print(dp[n][k]) 이번 문제는 DP 문제 유형 중 유명한 문제 중 하나로, 최대 무게가 정해진 가방에 무게(w)와 가치(v)가 주어진 물건들을 가지..

Algorithm/DP 2023.03.08

[백준 1463번] 1로 만들기

n = int(input()) dp = [0]*3000003 for i in range(1,n+1): if dp[i+1] == 0: dp[i+1] = dp[i] + 1 else: dp[i+1] = min(dp[i+1], dp[i]+1) if dp[i*2] == 0: dp[i*2] = dp[i] + 1 else: dp[i*2] = min(dp[i*2], dp[i]+1) if dp[i*3] == 0: dp[i*3] = dp[i] + 1 else: dp[i*3] = min(dp[i*3],dp[i]+1) print(dp[n]) 이번 문제는 입력받은 N을 '2로 나누기', '3으로 나누기', '1 빼기' 이 세가지 연산을 가지고 1을 만들 수 있는 최소 연산횟수를 구하는 문제였다. 처음에는 입력받은 N 값에서부터..

Algorithm/DP 2023.03.04

[백준 1904번] 01타일

이번 문제는 간단히 정리하자면 주어진 n의 자리수를 가지며 00과 1을 가지고 만들 수 있는 문자열의 개수를 구하는 문제이다. 처음에 이 문제를 보았을 때 왜 이게 DP 문제이고, 어떤 방식으로 문제를 풀어야 할지 감도 오지않았고, 결국 30분정도 고민하다가 풀이 접근 방법에 대해 이해하기 위하여 다른 분의 풀이를 참고하였다 😢 다른 분들의 풀이마저도 처음에 이해하기 어려웠기 때문에 직접 n=1(일의 자리수)부터 n=5(만의 자리수) 까지 종이에 적어보면서 이해해보기로 하였다. 다른 분들의 풀이를 참고하고 경우의 수를 직접 손으로 적어보니 이 문제가 왜 DP 문제인지 새삼 알 수 있었다. 1) 문제 접근법 n = 1 : 1 n = 2 : 00, 11 n = 3 : 100, 001, 111 n = 4 : ..

Algorithm/DP 2023.03.01

[백준 24416번] 알고리즘 수업 - 피보나치 수 1

n = int(input()) dp = [0]*41 count_r = 0 count_d = 0 def fib_recursive(n): # 일반적인 재귀함수 피보나치 수열 계산 global count_r if n==1 or n==2: count_r += 1 return 1 else: return fib_recursive(n-1) + fib_recursive(n-2) def fib_dynamic(n): # 동적계획법을 사용한 피보나치 수열 계산 global count_d if n==1 or n==2: if dp[n] == 0: dp[n] = 1 return dp[n] else: if dp[n] != 0: return dp[n] else: count_d += 1 dp[n] = fib_dynamic(n-1) +..

Algorithm/DP 2023.02.28