μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- μλ£κ΅¬μ‘°
- 그리λ
- μ½λ©ν μ€νΈ
- λͺ¨λ°μΌμ±νλ‘κ·Έλλ°
- 컴곡
- ChatGPT
- λ°±μ€
- SSE
- μ»΄ν¨ν°κ³΅ν
- boj11653
- νμ΄μ¬
- μ€νλ§
- λ°±μ€νμ΄
- μ½λ©
- μ΄νκ³μ
- μ°μ μμν
- κ°λ°μ
- μΉκ°λ°
- νλ‘ νΈμ€λ
- 리μ‘νΈλ€μ΄ν°λΈ
- μκ³ λ¦¬μ¦
- 그리λμκ³ λ¦¬μ¦
- 리μ‘νΈ
- νλ‘κ·Έλλ°
- λ°±μλ
- λ¨μν μ€νΈ
- λ°±μ€1436
- spring
- μΉκ°λ°κΈ°λ‘
- 컴곡μ
- Today
- Total
π»ππ§π
λ€μ΄λλ―Ή νλ‘κ·Έλλ° (Dynamic Programming) λ³Έλ¬Έ
λ€μ΄λλ―Ή νλ‘κ·Έλλ°
- λ€μ΄λλ―Ή νλ‘κ·Έλλ°μ λ©λͺ¨λ¦¬λ₯Ό μ μ ν μ¬μ©νμ¬ μν μκ° ν¨μ¨μ±μ λΉμ½μ μΌλ‘ ν₯μμν€λ λ°©λ²μ΄λ€.
- μ΄λ―Έ κ³μ°λ κ²°κ³Ό(μμ λ¬Έμ )λ λ³λμ λ©λͺ¨λ¦¬ μμμ μ μ₯νμ¬ λ€μ κ³μ°νμ§ μλλ‘ νλ€.
- λ€μ΄λλ―Ή νλ‘κ·Έλλ°μ ꡬνμ μΌλ°μ μΌλ‘ λ κ°μ§ λ°©μμΌλ‘ ꡬμ±λλ€.
- Top-down (νν₯μ)
- Botton-up (μν₯μ)
- λ€μ΄λλ―Ή νλ‘κ·Έλλ°μ λμ κ³νλ²μ΄λΌκ³ λ λΆλ¦°λ€.
- μΌλ°μ μΈ νλ‘κ·Έλλ° λΆμΌμμμ λμ (Dynamic) μλ―Έμ μ°¨μ΄μ
- μλ£κ΅¬μ‘°μμ λμ ν λΉ(Dynamic Allocation)μ 'νλ‘κ·Έλ¨μ΄ μ€νλλ λμ€μ μ€νμ νμν λ©λͺ¨λ¦¬λ₯Ό ν λΉνλ κΈ°λ²'
- λ€μ΄λλ―Ή νλ‘κ·Έλλ°μμ 'λ€μ΄λλ―Ή'μ λ³λ€λ₯Έ μλ―Έκ° μμ
<λ€μ΄λλ―Ή νλ‘κ·Έλλ°μ μ¬μ©ν μ μλ μ΅μ 쑰건>
- μ΅μ λΆλΆ ꡬ쑰 (Optimal Substructure) : ν° λ¬Έμ λ₯Ό μμ λ¬Έμ λ‘ λλ μ μμΌλ©° μμ λ¬Έμ μ λ΅μ λͺ¨μμ ν° λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€.
- μ€λ³΅λλ λΆλΆ λ¬Έμ (Overlapping Subproblem) : λμΌν μμ λ¬Έμ λ₯Ό λ°λ³΅μ μΌλ‘ ν΄κ²°ν΄μΌ νλ€.
→ νΌλ³΄λμΉ μμ΄μ λ€μ΄λλ―Ή νλ‘κ·Έλλ°μΌλ‘ ν¨κ³Όμ μΌλ‘ κ³μ°ν μ μμ
- νλ‘κ·Έλλ°μμλ μ΄λ¬ν μμ΄μ λ°°μ΄μ΄λ 리μ€νΈλ₯Ό μ΄μ©ν΄ νννλ€.
# νΌλ³΄λμΉ ν¨μ(Fibonacci Function)μ μ¬κ·ν¨μλ‘ κ΅¬ν
def fibo(x):
if x==1 or x==2:
return 1
return fibo(x-1) + fibo(x-2)
print(fibo(4))
β» λ¨μ μ¬κ· ν¨μλ‘ νΌλ³΄λμΉ μμ΄μ ν΄κ²°νλ©΄ μ§μ μκ° λ³΅μ‘λλ₯Ό κ°μ§κ² λλ€. -> μκ° λ³΅μ‘λκ° λμμ§ : O(2^n)
λ©λͺ¨μ΄μ μ΄μ (Memoization) -> νλ€μ΄ λ°©μ
- λ©λͺ¨μ΄μ μ΄μ μ λ€μ΄λλ―Ή νλ‘κ·Έλλ°μ ꡬννλ λ°©λ² μ€ νλμ΄λ€.
- ν λ² κ³μ°ν κ²°κ³Όλ₯Ό λ©λͺ¨λ¦¬ 곡κ°μ λ©λͺ¨νλ κΈ°λ².
- κ°μ λ¬Έμ λ₯Ό λ€μ νΈμΆνλ©΄ λ©λͺ¨νλ κ²°κ³Όλ₯Ό κ·Έλλ‘ κ°μ Έμ¨λ€.
- κ°μ κΈ°λ‘ν΄ λλλ€λ μ μμ μΊμ±(Caching)μ΄λΌκ³ λ νλ€.
- μλ°ν λ§νλ©΄ λ©λͺ¨μ΄μ μ΄μ
μ μ΄μ μ κ³μ°λ κ²°κ³Όλ₯Ό μΌμμ μΌλ‘ κΈ°λ‘ν΄ λλ λμ κ°λ
μ μλ―Ένλ€.
- ν λ² κ³μ°λ κ²°κ³Όλ₯Ό λ΄μ λκΈ°λ§ νκ³ λ€μ΄λλ―Ή νλ‘κ·Έλλ°μ μν΄ νμ©νμ§ μμ μλ μλ€.
β λ€μ΄λλ―Ή νλ‘κ·Έλλ°μ μ νμ μΈ ννλ 보ν μ λ°©μ
- κ²°κ³Ό μ μ₯μ© λ¦¬μ€νΈλ DP ν μ΄λΈμ΄λΌκ³ λΆλ¦
- 보ν μ λ°©μμμλ λ³΄ν΅ λ°λ³΅λ¬Έμ μ
↓ νΌλ³΄λμΉ μμ΄ : νλ€μ΄ λ€μ΄λλ―Ή νλ‘κ·Έλλ° μμ€μ½λ
# ν λ² κ³μ°λ κ²°κ³Όλ₯Ό λ©λͺ¨μ΄μ μ΄μ
(Memoization)νκΈ° μν 리μ€νΈ μ΄κΈ°ν
d = [0] * 100
# νΌλ³΄λμΉ ν¨μ(Fibonacci Function)λ₯Ό μ¬κ·ν¨μλ‘ κ΅¬ν(νλ€μ΄ λ€μ΄λλ―Ή νλ‘κ·Έλλ°)
def fibo(x):
# μ’
λ£ μ‘°κ±΄(1 νΉμ 2μΌ λ 1μ λ°ν)
if x==1 or x==2:
return 1
# μ΄λ―Έ κ³μ°ν μ μλ λ¬Έμ λΌλ©΄ κ·Έλλ‘ λ°ν
if d[x]!=0:
return d[x]
# μμ§ κ³μ°νμ§ μμ λ¬Έμ λΌλ©΄ μ νμμ λ°λΌμ νΌλ³΄λμΉ κ²°κ³Ό λ°ν
d[x] = fibo(x-1) + fibo(x-2)
return d[x]
print(fibo(99))
↓ νΌλ³΄λμΉ μμ΄ : 보ν μ λ€μ΄λλ―Ή νλ‘κ·Έλλ° μμ€μ½λ
# μμ κ³μ°λ κ²°κ³Όλ₯Ό μ μ₯νκΈ° μν DP ν
μ΄λΈ μ΄κΈ°ν
d = [0]*100
# 첫 λ²μ§Έ νΌλ³΄λμΉ μμ λ λ²μ§Έ νΌλ³΄λμΉ μλ 1
d[1] = 1
d[2] = 1
n = 99
# νΌλ³΄λμΉ ν¨μ(Fibonacci Function) λ°λ³΅λ¬ΈμΌλ‘ ꡬν(보ν
μ
λ€μ΄λλ―Ή νλ‘κ·Έλλ°)
for i in range(3,n+1):
d[i] = d[i-1] + d[i-2]
print(d[n])
→ μμ κ²λ€λΆν° ν΄κ²°ν νμ κ·Έκ²λ€μ μ’ ν©ν΄μ ν° κ²μ ν΄κ²°ν¨.
β λ©λͺ¨μ΄μ μ΄μ μ μ΄μ©νλ κ²½μ° νΌλ³΄λμΉ μμ΄ ν¨μμ μκ° λ³΅μ‘λλ O(N) μ΄λ€.
→μ§μ μκ° λ³΅μ‘λμμ μ ν μκ° λ³΅μ‘λλ‘ μ€μ΄λ¦
<λ€μ΄λλ―Ή νλ‘κ·Έλλ° λ¬Έμ μ μ κ·Όνλ λ°©λ²>
- μ£Όμ΄μ§ λ¬Έμ κ° λ€μ΄λλ―Ή νλ‘κ·Έλλ° μ νμμ νμ νλ κ²μ΄ μ€μνλ€.
- κ°μ₯ λ¨Όμ 그리λ, ꡬν, μμ νμ λ±μ μμ΄λμ΄λ‘ λ¬Έμ λ₯Ό ν΄κ²° ν μ μλμ§ κ²ν ν μ μλ€.
- λ€λ₯Έ μκ³ λ¦¬μ¦μΌλ‘ νμ΄ λ°©λ²μ΄ λ μ€λ₯΄μ§ μμΌλ©΄ λ€μ΄λλ―Ή νλ‘κ·Έλλ°μ κ³ λ €ν΄λ³΄μ.
- νΉν, λΆλΆ λ¬Έμ λ€μ΄ μ€λ³΅λλ€λ©΄ DPλ₯Ό μ μ©ν΄λ³Ό μ μμ (λΆλΆ λ¬Έμ λ€μ΄ μ€λ³΅λμ§ μμ λ λΆν μ 볡 κ³ λ €)
- μΌλ¨ μ¬κ· ν¨μλ‘ λΉν¨μ¨μ μΈ μμ νμ νλ‘κ·Έλ¨μ μμ±ν λ€μ (νλ€μ΄) μμ λ¬Έμ μμ ꡬν λ΅μ΄ ν° λ¬Έμ μμ κ·Έλλ‘ μ¬μ©λ μ μμΌλ©΄, μ½λλ₯Ό κ°μ νλ λ°©λ²μ μ¬μ©ν μ μλ€.
<λ¬Έμ 1> κ°λ―Έ μ μ¬
- κ°λ―Έ μ μ¬λ λΆμ‘±ν μλμ μΆ©λΉνκ³ μ λ©λκΈ° λ§μμ μλμ°½κ³ λ₯Ό λͺ°λ 곡격νλ €κ³ νλ€. λ©λκΈ° λ§μμ λ μ¬λ¬ κ°μ μλμ°½κ³ κ° μλλ° μλμ°½κ³ λ μΌμ§μ μΌλ‘ μ΄μ΄μ Έ μλ€.
- κ° μλμ°½κ³ μλ μ ν΄μ§ μμ μλμ μ μ₯νκ³ μμΌλ©° κ°λ―Έ μ μ¬λ μλμ°½κ³ λ₯Ό μ νμ μΌλ‘ μ½ννμ¬ μλ μ λΉΌμμ μμ μ΄λ€. μ΄λ λ©λκΈ° μ μ°°λ³λ€μ μΌμ§μ μμ μ‘΄μ¬νλ μλμ°½κ³ μ€μμ μλ‘ μΈμ ν μλμ°½κ³ κ° κ³΅κ²©λ°μΌλ©΄ λ°λ‘ μμμ± μ μλ€.
- λ°λΌμ κ°λ―Έ μ μ¬κ° μ μ°°λ³μκ² λ€ν€μ§ μκ³ μλμ°½κ³ λ₯Ό μ½ννκΈ° μν΄μλ μ΅μν ν μΉΈ μ΄μ λ¨μ΄μ§ μλμ°½κ³ λ₯Ό μ½νν΄μΌ νλ€.
- μ΄λ κ°λ―Έ μ μ¬λ λ λ²μ§Έ μλμ°½κ³ μ λ€ λ²μ§Έ μλμ°½κ³ λ₯Ό μ ννμ λ μ΅λκ°μΈ μ΄ 8κ°μ μλμ λΉΌμμ μ μλ€. κ°λ―Έ μ μ¬λ μλμ°½κ³ κ° μ΄λ κ² μΌμ§μ μμΌ λ μ΅λν λ§μ μλμ μ»κΈ°λ₯Ό μνλ€.
- κ°λ―Έ μ μ¬λ₯Ό μν΄ μλμ°½κ³ Nκ°μ λν μ λ³΄κ° μ£Όμ΄μ‘μ λ μ»μ μ μλ μλμ μ΅λκ°μ ꡬνλ νλ‘κ·Έλ¨μ μμ±νλΌ.
<λ¬Έμ ν΄κ²°>
ai = iλ²μ§Έ μλμ°½κ³ κΉμ§μ μ΅μ μ ν΄ (μ»μ μ μλ μλμ μ΅λκ°)
ki = iλ²μ§Έ μλμ°½κ³ μ μλ μλμ μ
μ νμ : ai = max(ai-1,ai-2+ki)
<μ½λ>
# μ μ Nμ μ
λ ₯ λ°κΈ°
n = int(input())
# λͺ¨λ μλ μ 보 μ
λ ₯ λ°κΈ°
array = list(map(int, input().split()))
# μμ κ³μ°λ κ²°κ³Όλ₯Ό μ μ₯νκΈ° μν DP ν
μ΄λΈ μ΄κΈ°ν
d = [0] * 100
# λ€μ΄λλ―Ή νλ‘κ·Έλλ° μ§ν (보ν
μ
)
d[0] = array[0]
d[1] = max(array[0], array[1])
for i in range(2,n):
d[i] = max(d[i-1],d[i-2]+array[i])
# κ³μ°λ κ²°κ³Ό μΆλ ₯
print(d[n-1])
<λ¬Έμ 2> 1λ‘ λ§λ€κΈ°
- μ μ Xκ° μ£Όμ΄μ‘μ λ, μ μ Xμ μ¬μ©ν μ μλ μ°μ°μ λ€μκ³Ό κ°μ΄ 4κ°μ§μ΄λ€.
- Xκ° 5λ‘ λλμ΄ λ¨μ΄μ§λ©΄, 5λ‘ λλλ€.
- Xκ° 3μΌλ‘ λλμ΄ λ¨μ΄μ§λ©΄, 3μΌλ‘ λλλ€.
- Xκ° 2λ‘ λλμ΄ λ¨μ΄μ§λ©΄, 2λ‘ λλλ€.
- Xμμ 1μ λΊλ€.
- μ μ Xκ° μ£Όμ΄μ‘μ λ, μ°μ° 4κ°λ₯Ό μ μ ν μ¬μ©ν΄μ κ°μ 1λ‘ λ§λ€κ³ μ νλ€. μ°μ°μ μ¬μ©νλ νμμ μ΅μκ°μ μΆλ ₯νλΌ. μλ₯Ό λ€μ΄ μ μκ° 26μ΄λ©΄ λ€μκ³Ό κ°μ΄ κ³μ°ν΄μ 3λ²μ μ°μ°μ΄ μ΅μκ°μ΄λ€.
- 26 → 25 → 5 → 1
<μ½λ>
# μ μ Xλ₯Ό μ
λ ₯ λ°κΈ°
x = int(input())
# μμ κ³μ°λ κ²°κ³Όλ₯Ό μ μ₯νκΈ° μν DP ν
μ΄λΈ μ΄κΈ°ν
d = [0] * 30001
# λ€μ΄λλ―Ή νλ‘κ·Έλλ° μ§ν (보ν
μ
)
for i in range(2, x+1):
# νμ¬μ μμμ 1μ λΉΌλ κ²½μ°
d[i] = d[i-1] + 1
# νμ¬μ μκ° 2λ‘ λλμ΄ λ¨μ΄μ§λ κ²½μ°
if i%2==0:
d[i] = min(d[i],d[i//2]+1)
# νμ¬μ μκ° 3μΌλ‘ λλμ΄ λ¨μ΄μ§λ κ²½μ°
if i%3==0:
d[i] = min(d[i],d[i//3]+1)
# νμ¬μ μκ° 5λ‘ λλμ΄ λ¨μ΄μ§λ κ²½μ°
if i%5==0:
d[i] = min(d[i],d[i//5]+1)
print(d[x])
<λ¬Έμ 3> ν¨μ¨μ μΈ νν ꡬμ±
- Nκ°μ§ μ’ λ₯μ ννκ° μλ€. μ΄ ννλ€μ κ°μλ₯Ό μ΅μνμΌλ‘ μ΄μ©ν΄μ κ·Έ κ°μΉμ ν©μ΄ Mμμ΄ λλλ‘ νλ €κ³ νλ€. μ΄λ κ° μ’ λ₯μ ννλ λͺ κ°λΌλ μ¬μ©ν μ μλ€.
- μλ₯Ό λ€μ΄ 2μ, 3μ λ¨μμ ννκ° μμ λλ 15μμ λ§λ€κΈ° μν΄ 3μμ 5κ° μ¬μ©νλ κ²μ΄ κ°μ₯ μ΅μνμ νν κ°μμ΄λ€.
- Mμμ λ§λ€κΈ° μν μ΅μνμ νν κ°μλ₯Ό μΆλ ₯νλ νλ‘κ·Έλ¨μ μμ±νλΌ.
<μ½λ>
# μ μ N,Mμ μ
λ ₯λ°κΈ°
n,m = map(int, input().split())
# Nκ°μ νν λ¨μ μ 보λ₯Ό μ
λ ₯λ°κΈ°
array = []
for i in range(n):
array.append(int(input()))
# ν λ² κ³μ°λ κ²°κ³Όλ₯Ό μ μ₯νκΈ° μν DP ν
μ΄λΈ μ΄κΈ°ν
d = [10001] * (m+1)
# λ€μ΄λλ―Ή νλ‘κ·Έλλ° μ§ν (보ν
μ
)
d[0] = 0
for i in range(n):
for j in range(array[i],m+1):
if d[j-array[i]] != 10001:
d[j] = min(d[j], d[j-array[i]]+1)
# κ³μ°λ κ²°κ³Ό μΆλ ₯
if d[m] == 10001: # μ΅μ’
μ μΌλ‘ Mμμ λ§λλ λ°©λ²μ΄ μλ κ²½μ°
print(-1)
else:
print(d[m])
<λ¬Έμ 3> κΈκ΄
- n x m ν¬κΈ°μ κΈκ΄μ΄ μλ€. κΈκ΄μ 1 x 1 ν¬κΈ°μ μΉΈμΌλ‘ λλμ΄μ Έ μμΌλ©°, κ° μΉΈμ νΉμ ν ν¬κΈ°μ κΈμ΄ λ€μ΄ μλ€.
- μ±κ΅΄μλ 첫 λ²μ§Έ μ΄λΆν° μΆλ°νμ¬ κΈμ μΊκΈ° μμνλ€. 맨 μ²μμλ 첫 λ²μ§Έ μ΄μ μ΄λ νμμλ μΆλ°ν μ μλ€. μ΄νμ m - 1λ²μ κ±Έμ³μ λ§€λ² μ€λ₯Έμͺ½ μ, μ€λ₯Έμͺ½, μ€λ₯Έμͺ½ μλ 3κ°μ§ μ€ νλμ μμΉλ‘ μ΄λν΄μΌ νλ€. κ²°κ³Όμ μΌλ‘ μ±κ΅΄μκ° μ»μ μ μλ κΈμ μ΅λ ν¬κΈ°λ₯Ό μΆλ ₯νλ νλ‘κ·Έλ¨μ μμ±νλΌ.
<λ¬Έμ ν΄κ²°>
- κΈκ΄μ λͺ¨λ μμΉμ λνμ¬ λ€μμ μΈ κ°μ§λ§ κ³ λ €νλ©΄ λλ€.
- μΌμͺ½ μμμ μ€λ κ²½μ°
- μΌμͺ½ μλμμ μ€λ κ²½μ°
- μΌμͺ½μμ μ€λ κ²½μ°
- μΈ κ°μ§ κ²½μ° μ€μμ κ°μ₯ λ§μ κΈμ κ°μ§κ³ μλ κ²½μ°λ₯Ό ν μ΄λΈμ κ°±μ ν΄μ£Όμ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ€.
- array[i][j] = iν jμ΄μ μ‘΄μ¬νλ κΈμ μ
- dp[i][j] = iν jμ΄κΉμ§μ μ΅μ μ ν΄ (μ»μ μ μλ κΈμ μ΅λκ°)
- μ νμ : dp[i][j] = array[i][j] + max(dp[i-1][j-1], dp[i][j-1], dp[i+1][j-1])
- μ΄λ ν μ΄λΈμ μ κ·Όν λλ§λ€ 리μ€νΈμ λ²μλ₯Ό λ²μ΄λμ§ μλμ§ μ²΄ν¬ν΄μΌ νλ€.
- νΈμμ μ΄κΈ° λ°μ΄ν°λ₯Ό λ΄λ λ³μ arrayλ₯Ό μ¬μ©νμ§ μμλ λλ€.
- λ°λ‘ DP ν μ΄λΈμ μ΄κΈ° λ°μ΄ν°λ₯Ό λ΄μμ λ€μ΄λλ―Ή νλ‘κ·Έλλ°μ μ μ©ν μ μλ€.
<μ½λ>
# ν
μ€νΈ μΌμ΄μ€(Test Case) μ
λ ₯
for tc in range(int(input())):
# κΈκ΄ μ 보 μ
λ ₯
n, m = map(int, input().split())
array = list(map(int, input().split()))
# λ€μ΄λλ―Ή νλ‘κ·Έλλ°μ μν 2μ°¨μ DP ν
μ΄λΈ μ΄κΈ°ν
dp = []
index = 0
for i in range(n):
dp.append(array[index:index+m])
index += m
# λ€μ΄λλ―Ή νλ‘κ·Έλλ° μ§ν
for j in range(1, m):
for i in range(n):
# μΌμͺ½ μμμ μ€λ κ²½μ°
if i==0:left_up = 0
else: left_up = dp[i-1][j-1]
# μΌμͺ½ μλμμ μ€λ κ²½μ°
if i==n-1: left_down = 0
else: left_down = dp[i+1][j-1]
# μΌμͺ½μμ μ€λ κ²½μ°
left = dp[i][j-1]
dp[i][j] = dp[i][j] + max(left_up, left_down, left)
result = 0
for i in range(n):
result = max(result, dp[i][m-1])
print(result)
→ array[index:index+m] : index λΆν° (index+m)-1 κΉμ§ μ¬λΌμ΄μ€ ν¨
<λ¬Έμ 4> λ³μ¬ λ°°μΉνκΈ°
- Nλͺ μ λ³μ¬κ° 무μμλ‘ λμ΄λμ΄ μλ€. κ° λ³μ¬λ νΉμ ν κ°μ μ ν¬λ ₯μ 보μ νκ³ μλ€.
- λ³μ¬λ₯Ό λ°°μΉν λλ μ ν¬λ ₯μ΄ λμ λ³μ¬κ° μμͺ½μ μ€λλ‘ λ΄λ¦Όμ°¨μμΌλ‘ λ°°μΉλ₯Ό νκ³ μ νλ€. λ€μ λ§ν΄ μμͺ½μ μλ λ³μ¬μ μ ν¬λ ₯μ΄ νμ λ€μͺ½μ μλ λ³μ¬λ³΄λ€ λμμΌ νλ€.
- λν λ°°μΉ κ³Όμ μμλ νΉμ ν μμΉμ μλ λ³μ¬λ₯Ό μ΄μΈμν€λ λ°©λ²μ μ΄μ©νλ€. κ·Έλ¬λ©΄μλ λ¨μ μλ λ³μ¬μ μκ° μ΅λκ° λλλ‘ νκ³ μΆλ€.
<λ¬Έμ ν΄κ²°>
- μ΄ λ¬Έμ μ κΈ°λ³Έ μμ΄λμ΄λ κ°μ₯ κΈ΄ μ¦κ°νλ λΆλΆ μμ΄(Longest Increasing Subsequence, LIS)λ‘ μλ €μ§ μ νμ μΈ λ€μ΄λλ―Ή νλ‘κ·Έλλ° λ¬Έμ μ μμ΄λμ΄μ κ°λ€.
- μλ₯Ό λ€μ΄ νλμ μμ΄ array = {4, 2, 5, 8, 4, 11, 15}μ΄ μλ€κ³ νμ.
- μ΄ μμ΄μ κ°μ₯ κΈ΄ μ¦κ°νλ λΆλΆ μμ΄μ {4, 5, 8, 11, 15}μ΄λ€.
- λ³Έ λ¬Έμ λ κ°μ₯ κΈ΄ κ°μνλ λΆλΆ μμ΄μ μ°Ύλ λ¬Έμ λ‘ μΉνν μ μμΌλ―λ‘, LIS μκ³ λ¦¬μ¦μ μ‘°κΈ μμ νμ¬ μ μ©ν¨μΌλ‘μ¨ μ λ΅μ λμΆν μ μλ€.
- μ νμ : λͺ¨λ 0 ≤ j < i μ λνμ¬, D[i] = max(D[i], D[j]+1) if array[j] < array[i]
<μ½λ>
n = int(input())
array = list(map(int, input().split()))
# μμλ₯Ό λ€μ§μ΄ 'μ΅μ₯ μ¦κ° λΆλΆ μμ΄' λ¬Έμ λ‘ λ³ν
array.reverse()
# λ€μ΄λλ―Ή νλ‘κ·Έλλ°μ μν 1μ°¨μ DP ν
μ΄λΈ μ΄κΈ°ν
dp = [1] * n
# κ°μ₯ κΈ΄ μ¦κ°νλ λΆλΆ μμ΄(LIS) μκ³ λ¦¬μ¦ μν
for i in range(1,n):
for j in range(0,i):
if array[j] < array[i]:
dp[i] = max(dp[i], dp[j]+1)
# μ΄μΈν΄μΌ νλ λ³μ¬μ μ΅μ μλ₯Ό μΆλ ₯
print(n-max(dp))
'μκ³ λ¦¬μ¦' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
νμ΄μ¬ μ½λ©ν μ€νΈ μ ν·κ°λ¦¬λ λΆλΆ μ 리 (0) | 2024.03.02 |
---|---|
μ°μ μμ ν (Priority Queue) (0) | 2023.02.15 |
DFS & BFS μκ³ λ¦¬μ¦ (0) | 2023.01.20 |
그리λ μκ³ λ¦¬μ¦ (Greedy Algorithm) (0) | 2023.01.16 |