본문 바로가기

dp39

[백준 2579번] 계단 오르기 n = int(input()) score = [0]*n dp = [0]*n for i in range(n): score[i] = int(input()) if n == 1: print(score[0]) elif n == 2: print(score[0]+score[1]) elif n == 3: print(score[0]+max(score[1],score[2])) else: dp[0] = score[0] dp[1] = score[0] + score[1] dp[2] = score[2] + max(score[1],score[0]) for i in range(3,n): dp[i] = score[i] + max(score[i-1] + dp[i-3], dp[i-2]) print(dp[n-1]) 이번 문제는 다음과 같은.. 2023. 3. 5.
[백준 1149번] RGB거리 import sys input = sys.stdin.readline n = int(input()) area = [[0]*3 for _ in range(n)] dp = [[0]*3 for _ in range(n)] for i in range(n): area[i] = list(map(int,input().split())) dp[0] = area[0] for i in range(1,n): for j in range(3): if j == 0: dp[i][j] = area[i][j] + min(dp[i-1][1], dp[i-1][2]) elif j == 1: dp[i][j] = area[i][j] + min(dp[i-1][0], dp[i-1][2]) else: dp[i][j] = area[i][j] + min(d.. 2023. 3. 5.
[백준 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 값에서부터.. 2023. 3. 4.
[백준 9461번] 파도반 수열 def solution(n): dp = [0]*101 dp[1], dp[2], dp[3], dp[4], dp[5] = 1, 1, 1, 2, 2 if n=6) = P(n-1) + P(n-5) 위와 같은 점화식이 도출되고 나서, DP 알고리즘 중에서도 Top-Down 방식을 사용하여 문제를 해결할 수 있었다 :) (재귀 함수를 이용한 탑-다운이 아니라, 반복문을 이용한 바텀-업 방식을 사용했다면 더 빠르게 풀이할 수 있었을 것이다.) 2023. 3. 2.
[백준 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 : .. 2023. 3. 1.
[백준 9184번] 신나는 함수 실행 import sys input = sys.stdin.readline def w(a,b,c): if a 20: return w(20,20,20) if dp[a][b][c]: return dp[a][b][c] if a < b and b < c: dp[a][b][c] = w(a,b,c-1) + w(a,b-1,c-1) - w(a,b-1,c) return dp[a][b][c] dp[a][b][c] = w(a-1,b,c) + w(a-1,b-1,c) + w(a-1,b,c-1) - w(a-1,b-1,c-1) return dp[a][b][c] dp = [[[0 for _ in range(21)] for _ in range(21)] for _ in range(21)] while True: a, b, c = map(int,.. 2023. 3. 1.