DP

각 집을 λΉ¨κ°•, 초둝, νŒŒλž‘μœΌλ‘œ μΉ ν•˜λŠ” λΉ„μš©μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ, μΈμ ‘ν•œ 집듀이 같은 색이 λ˜μ§€ μ•Šλ„λ‘ ν•˜λ©΄μ„œ λͺ¨λ“  집을 μΉ ν•˜λŠ” μ΅œμ†Œ λΉ„μš©μ„ κ΅¬ν•˜λŠ” 문제-> DP ν…Œμ΄λΈ”μ„ 2차원 리슀트둜 μ •μ˜ν•˜μ—¬ ν’€ 수 μžˆλ‹€. ν’€μ΄λ™μ  ν”„λ‘œκ·Έλž˜λ° ν…Œμ΄λΈ” μ •μ˜:dp[i][j]: i번째 집을 jμƒ‰μœΌλ‘œ μΉ ν•˜λŠ” μ΅œμ†Œ λΉ„μš© (j = 0: λΉ¨κ°•, 1: 초둝, 2: νŒŒλž‘)점화식 μ„€μ •:dp[i][0] = cost[i][0] + min(dp[i-1][1], dp[i-1][2]) (i번째 집을 λΉ¨κ°•μœΌλ‘œ μΉ ν•˜λŠ” 경우)dp[i][1] = cost[i][1] + min(dp[i-1][0], dp[i-1][2]) (i번째 집을 초둝으둜 μΉ ν•˜λŠ” 경우)dp[i][2] = cost[i][2] + min(dp[i-1][0], dp[i-1][1]) (i번째 ..
문제 μ„€λͺ…μžμ—°μˆ˜ ( n )이 μ£Όμ–΄μ§ˆ λ•Œ, ( n )을 μ΅œμ†Œ 개수의 제곱수 ν•©μœΌλ‘œ ν‘œν˜„ν•˜λŠ” 방법을 μ°ΎλŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λŠ” λ¬Έμ œμ΄λ‹€. λΌκ·Έλž‘μ£ΌλŠ” 1770년에 λͺ¨λ“  μžμ—°μˆ˜λŠ” λ„· ν˜Ήμ€ κ·Έ μ΄ν•˜μ˜ 제곱수의 ν•©μœΌλ‘œ ν‘œν˜„ν•  수 μžˆλ‹€κ³  증λͺ…ν•˜μ˜€λ‹€. 예λ₯Ό λ“€μ–΄, 26은 ( 5^2 + 1^2 )둜 ν‘œν˜„ν•  수 있고, ( 4^2 + 3^2 + 1^2 )λ‘œλ„ ν‘œν˜„ν•  수 μžˆλ‹€. 이 λ¬Έμ œμ—μ„œλŠ” ( n )을 μ΅œμ†Œ 개수의 제곱수 ν•©μœΌλ‘œ ν‘œν˜„ν•  λ•Œ κ·Έ μ΅œμ†Œ 개수λ₯Ό ꡬ해야 ν•œλ‹€. ν’€μ΄ μ„€λͺ…이 λ¬Έμ œλŠ” 동적 κ³„νšλ²•(Dynamic Programming)을 μ‚¬μš©ν•˜μ—¬ ν•΄κ²°ν•  수 μžˆλ‹€. def min_squares(n): # dp[i]λŠ” iλ₯Ό μ΅œμ†Œ 개수의 제곱수 ν•©μœΌλ‘œ ν‘œν˜„ν•˜λŠ” λ°©λ²•μ˜ 개수λ₯Ό μ €μž₯ dp = [float('inf')] *..
주어진 μ‚Όκ°ν˜• 그림을 보면, μž‘μ€ μ‚Όκ°ν˜•μ˜ ν•©μœΌλ‘œ λ‹€μŒ μ‚Όκ°ν˜•μ΄ μ±„μ›Œμ§„λ‹€.-> DP μ£Όμ–΄μ§„ 그림을 그렀보며 생각해보면, 점화식을 어렡지 μ•Šκ²Œ 찾을 수 μžˆλ‹€.N12345678P(N)11122345P(8) = P(7) + P(3)P(7) = P(6) + P(2)P(6) = P(5) + P(1-> P(N) = P(N-1) + P(N-5)이닀. ν’€μ΄dp = [0] * 101dp[1] = dp[2] = dp[3] = 1dp[4] = dp[5] = 2for i in range(6, 101): dp[i] = dp[i-1] + dp[i-5]t = int(input()) # ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ 개수for _ in range(t): n = int(input()) print(dp[n])
문제 μš”μ•½κ° κ³„λ‹¨μ—λŠ” μΌμ •ν•œ μ μˆ˜κ°€ μ“°μ—¬ 있음 - κ·Έ 점수 μ–»μŒ1. ν•œ 계단 / 두 계단씩 였λ₯Ό 수 μžˆλ‹€2. μ—°μ†λœ μ„Έ 개의 계단은 λͺ¨λ‘ λ°Ÿμ•„μ„œλŠ” μ•ˆ λœλ‹€3. λ§ˆμ§€λ§‰ 도착 계단은 λ°˜λ“œμ‹œ λ°Ÿμ•„μ•Ό ν•œλ‹€κ° 계단에 μ“°μ—¬ μžˆλŠ” μ μˆ˜κ°€ μ£Όμ–΄μ§ˆ λ•Œ 총 점수의 μ΅œλŒ“κ°’  ν’€μ΄DP둜 ν’€ 수 μžˆλ‹€. 'λ§ˆμ§€λ§‰ 도착 계단은 λ°˜λ“œμ‹œ λ°Ÿμ•„μ•Ό ν•œλ‹€' λΌλŠ” 쑰건 -> 도착지뢀터 μƒκ°ν•˜λŠ” 접근이 더 쉽닀. n번째 계단에 올라였기 μœ„ν•΄μ„œλŠ” 두 가지 κ²½μš°κ°€ μžˆλ‹€.1. n-1번째 κ³„λ‹¨μ—μ„œ μ˜€λŠ” 경우dp[n] = dp[n-3] + stairs[n-1] + stairs[n]2. n-2번째 κ³„λ‹¨μ—μ„œ μ˜€λŠ” 경우dp[n] = dp[n-2] + stairs[n]-> 이 μ€‘μ—μ„œ 더 큰 μˆ˜κ°€ dp[n]이 λœλ‹€. dp[n-3]이 있기 λ•Œλ¬Έμ— 1, 2, 3번..
2×n 크기의 μ§μ‚¬κ°ν˜•μ„ μ±„μš°λŠ” λ°©λ²•μ˜ 수 n이 1일 λ•ŒλŠ” 1, n이 2일 λ•ŒλŠ” κ°€λ‘œ λ‘κ°œ, μ„Έλ‘œ λ‘κ°œλ‘œ 2가지 ( =, || )n이 3일 λ•ŒλŠ” n이 2일 λ•Œ + n이 1일 λ•Œn이 4일 λ•ŒλŠ” n이 3일 λ•Œ + n이 2일 λ•Œ-> 점화식 : μ§μ‚¬κ°ν˜• κ°€λ‘œμ˜ 길이가 N인 κ²½μš°λŠ” n-1 경우의 수 + n-2 경우의 수λ₯Ό λ”ν•œ κ°’ n = int(input())def tiling(n): if n == 1: return 1 if n == 2: return 2 dp = [0] * (n + 1) dp[1] = 1 dp[2] = 2 for i in range(3, n+1): dp[i] = (dp[i-1] + dp[i-2]) % 10007 ..
동적 ν”„λ‘œκ·Έλž˜λ°(Dynamic Programming)을 μ‚¬μš©ν•˜μ—¬ 0κ³Ό 1둜 이루어진 νŠΉμ • μˆ˜μ—΄μ„ μƒμ„±ν•˜κ³ , 주어진 μˆ˜μ—΄μ˜ 각 μˆ«μžλ“€ 쀑 0κ³Ό 1의 개수λ₯Ό ꡬ할 수 μžˆλ‹€. ν”Όλ³΄λ‚˜μΉ˜ nμ—μ„œ 0 호좜횟수 = (ν”Όλ³΄λ‚˜μΉ˜ n-1μ—μ„œ 0 호좜횟수) + (ν”Όλ³΄λ‚˜μΉ˜ n-2μ—μ„œ 0 호좜 횟수)ν”Όλ³΄λ‚˜μΉ˜ nμ—μ„œ 1 호좜횟수 = (ν”Όλ³΄λ‚˜μΉ˜ n-1μ—μ„œ 1 호좜횟수) + (ν”Όλ³΄λ‚˜μΉ˜ n-2μ—μ„œ 1 호좜 횟수)μ΄λ―€λ‘œ  μ ν™”식count_zero[i] = count_zero[i-1] + count_zero[i-2]count_one[i] = count_one[i-1] + count_one[i-2]이런 점화식을 생각할 수 μžˆλ‹€. t = int(input()) # ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 수 μž…λ ₯def count_ways(n): count_z..
풀이 1: DP이 문제λ₯Ό μœ„ν•œ κ°€μž₯ 효율적인 방법은 DPλ₯Ό μ‚¬μš©ν•˜λŠ” 것이닀.  μ΄ˆκΈ°κ°’μ΄ˆκΈ°κ°’ dp[1] = 1, dp[2] = 2, dp[3] = 4(dp[2]λŠ” 1+1, 2둜 2가지, p[3]은 1+1+1, 1+2, 2+1, 3으둜 4가지) μ ν™”식4일 λ•Œ dp[3]+1, dp[2]+2, dp[1]+3와 같이 ꡬ할 수 μžˆλ‹€. --> n은 dp[n-1]+3, dp[n-2]+2, dp[n-3]+3--> λ°©λ²•μ˜ 수 dp[n] = dp[n-1] + dp[n-2] + dp[n-3] 1, 2, 3의 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚΄λŠ” λ°©λ²•μ˜ μˆ˜μ—μ„œ ν•œ 번 κ³„μ‚°ν•œ 값을 μž¬μ‚¬μš©ν•¨μœΌλ‘œμ¨ 쀑볡 계산을 λ°©μ§€ν•˜κ³ , μ‹œκ°„ λ³΅μž‘λ„λ₯Ό 쀄일 수 μžˆλ‹€.def count_ways(n): # n을 1, 2, 3의 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” λ°©λ²•μ˜ 수λ₯Ό μ €μž₯..
subproblem 쀑볡, λ°˜λ³΅μ—°μ‚° 많음 -> DP ν’€μ΄1 (Bottom-up)n = int(input())dp = [0] * (n+1)for i in range(2, n+1): dp[i] = dp[i-1] + 1 if i % 3 == 0: dp[i] = min(dp[i//3]+1, dp[i]) if i % 2 == 0: dp[i] = min(dp[i//2]+1, dp[i]) print(i, ": ", dp[i])if n  ν’€μ΄2 (Top-Down) - Recursion Errordef min_operations(n, dp): if n 0: # 이미 κ³„μ‚°λœ 값이 μžˆλ‹€λ©΄ κ·Έ 값을 λ°˜ν™˜ return dp[n] dp[n] = mi..
κ²ΉμΉ˜λŠ” ν•˜μœ„ 문제(Subproblem)λ₯Ό ν•΄κ²°ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό μ €μž₯ν•΄ λ‚˜κ°€λŠ” λ°©μ‹μœΌλ‘œ μ΅œμ ν™” λ¬Έμ œλ“€ νŠΉμ§•1. μž‘μ€ ν•˜μœ„λ¬Έμ œλ“€μ΄ 반볡적으둜 λ°œμƒν•˜λ©°, μ΄λ“€μ˜ ν•΄κ²° κ²°κ³Όκ°€ μž¬ν™œμš©λ  수 μžˆμ„ λ•Œ 2. Optimal Substructure(μ΅œμ λΆ€λΆ„κ΅¬μ‘°)을 κ°–μΆ˜ 문제. 큰 문제의 μ΅œμ ν•΄κ°€ μž‘μ€ 문제의 μ΅œμ ν•΄λ₯Ό 톡해 ꡬ할 수 μžˆμ„ λ•Œ 3. μ€‘λ³΅λœ 계산을 μ΅œμ†Œν™”ν•  수 μžˆλŠ” ꡬ쑰. 같은 ν•˜μœ„ 문제λ₯Ό λ°˜λ³΅ν•΄μ„œ ν•΄κ²°ν•΄μ•Ό ν•  λ•Œ ν•˜μœ„λ¬Έμ œκ°€ 독립적, μ€„μ—¬κ°€λ©΄μ„œ ν•΄κ²° -> Divide & Conquer ν•˜μœ„λ¬Έμ œκ°€ 쀑첩됨, λ°˜λ³΅ν•΄μ•Ό 함 -> Dynamic Programming DP둜 ν•΄κ²°ν•˜λŠ” λŒ€ν‘œμ μΈ λ¬Έμ œλ“€longest common subsequenceKnapsack problemRod cutting problemshortest ..
yesolz
'DP' νƒœκ·Έμ˜ κΈ€ λͺ©λ‘