[μ΄μ½ν /python] λ€μ΄λλ―Ή νλ‘κ·Έλλ° κ°λ μ 리 & λ¬Έμ νμ΄ κΈ°λ‘ β λ°±μ€ dp λ¬Έμ νμ΄
DP
DPλ νλ² ν΄κ²°ν λ¬Έμ λ λ€μ κ³μ°νμ§ μλλ‘ νλ€.
λ©λͺ¨λ¦¬ 곡κ°μ΄ νμν λλ§λ€ νλ‘κ·Έλ¨μ΄ μ€νλλ λμ€μ νμν λ©λͺ¨λ¦¬λ₯Ό ν λΉνλ κ²μ΄ μλ£κ΅¬μ‘°μμμ λ€μ΄λλ―Ήμ μλ―Έ!
νΌλ³΄λμΉ μμ΄
λ€μ΄λλ―Ή νλ‘κ·Έλλ°μΌλ‘ ν΄κ²°ν μ μλ λνμ μΈ λ¬Έμ
μ νμμ μ¬κ·ν¨μννλ‘ κ΅¬ν κ°λ₯
μ λκ°μ νμ λνμ¬ κ·Έ λ€μ νμ λ§λ λ€.
f(3)μ νΈμΆν λ f(2)μ f(1)μ νΈμΆν κ²°κ³Όλ₯Ό λν΄μ ꡬν μ μλ€.
def fibo(x):
if x==1 or x ==2:
return 1
return fibo(x-1) + fibo(x-2)
print(fibo(4))
# μ¬κ·ν¨μλ₯Ό λ§λ€ λν΄λ 무ν λ°λ³΅νμ§ μλλ‘ μ’
λ£μ‘°κ±΄μ μ μ΄μ€μΌνλ€!
# x κ° 1 λλ 2μΌ λκ° μ’
λ£ μ‘°κ±΄μ΄λ€.
μ νμ λΆλΆμ΄ μ¬κ·μ, a1κ³Ό a2μ΄ μ’ λ£μ‘°κ±΄μ΄ λλ€.
f(6)μ νΈμΆνμ λΏμΈλ° f(2)κ° 5λ² νΈμΆλκ³ μλ€. -> μν μκ° λΉν¨μ¨
λ°λΌμ νλ² ν΄κ²°ν f(2)μ λν΄μ μ΄ λ¬Έμ μ λ΅μ μ΄κ±°λΌκ³ μλ €μ€ μ μλλ‘ ν΄μΌ νλ€
.
λ€μ΄λλ―Ή νλ‘κ·Έλλ° λ¬Έμ ν΄κ²° λ°©λ² (νν₯μ)
λ°°μ΄ μ΄λ¦μ cache, table ,dp, dλΌκ³ μ€μ νκ³€ νλ€.
μν₯μμ λ°λ³΅λ¬Έμ ν΄κ²°νλ€.
dpλ₯Ό ν΄κ²°νλ λ°©λ² μ€ νν₯μμΌλ‘ μ κ·Όν λ λ©λͺ¨μ΄μ μ΄μ λ°©λ²μ μ¬μ©ν μ μλ€.
νΌλ³΄λμΉ μμ΄ νλ€μ΄ λ©λͺ¨μ΄μ μ΄μ λ°©μ ꡬν
#νλ² κ³μ°λ κ²°κ³Όλ₯Ό λ©λͺ¨μ΄μ μ΄μ
νκΈ° μν 리μ€νΈ μ΄κΈ°ν
d = [0] * 100
# νΌλ³΄λμΉ ν¨μλ₯Ό μ¬κ·ν¨μλ‘ κ΅¬ν (νλ€μ΄ λ€μ΄λλ―Ή νλ‘κ·Έλλ°)
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
# λ°ν
μ
λ°©μμ μ¬κ·κ° μλ λ°λ³΅λ¬ΈμΌλ‘ ꡬν!
# μμ λ¬Έμ λΆν° ν΄κ²°νκ³ , λ¨Όμ ν΄κ²°ν΄λμ λ¬Έμ λ₯Ό μ‘°ν©ν΄μ μμΌλ‘μ ν° λ¬Έμ λ₯Ό μ°¨λ‘λλ‘ κ΅¬νλ€.
for i in range(3,n+1):
d[i] = d[i-1] + d[i-2]
print(d[n])
μ§μ μκ°λ§νΌ 걸리λ νΌλ³΄λμΉ μμ΄ λ¬Έμ μ μκ° λ³΅μ‘λλ₯Ό O(N) λ§νΌ μ€μΌ μ μλ€.
νΌλ²μ 5λ‘ μ€μ ν ν΅ μ λ ¬μ μννλ©΄ 5λ³΄λ€ μμ μμμ 5λ³΄λ€ ν° μμλ‘ λΆλ¦¬λλ€.
μ΄λ κ² νλ² λΆν μ΄ μ΄λ£¨μ΄μ§ μ΄ν 5μ λν΄μλ μ΄μ μ²λ¦¬λμ§ μλλ€. λ€λ₯Έ λΆλΆ λ¬Έμ μ ν¬ν¨λμ§ μλλ€.
- μμ λ¬Έμ λ₯Ό ν΅ν΄ ν° λ¬Έμ λ₯Ό ν΄κ²°
- λΆλΆ λ¬Έμ κ° μ€λ³΅
-> λ€μ΄λλ―Ή νλ‘κ·Έλλ°μΌλ‘ μ κ·Ό
1οΈβ£μ€μ λ¬Έμ 1 : 1λ‘ λ§λ€κΈ°
μ°μ°μ μ΅μκ°μ ꡬνλ λ¬Έμ μ΄λ€.
λ¨μν 5λ‘ λλκΈ°, 3μΌλ‘ λλκΈ°, 1μ λΉΌμ£Όλ μ°μ°μ λ°λ³΅νλ κ²μ΄ μλλΌ μ λ ₯λ κ°μ λ°λΌμ μ λ ₯κ°μ 1λ‘ λ§λλ μ°μ°μ μ΅μκ°μ ꡬν΄μΌνλ λ¬Έμ μλ€.
λ€μ΄λλ―Ή νλ‘κ·Έλλ°μ μ΄μ©ν΄μ
μ λ ₯κ°μ΄ 1μΌ λλΆν°
μ΄κΈ° μ½λλ€.. μ΄λ€ λ°©μμΌλ‘ νμ΄μΌν μ§ κ°μ΄ μ μ‘νμ§ μμλ€.
n = int(input().split())
count =0
def fibo(x):
while(True):
if x==1:
return count
elif x % 5 ==0:
count +=1
x = x//5
elif x % 3==0:
count +=1
x = x//3
else:
count +=1
x -=1
fibo(n)
μ΅μ’ μ½λλ μλμ κ°λ€.
λ§μ½ 2λ‘ λλμ΄ λ¨μ΄μ§λ κ²½μ° 1μ λΊ κ²½μ°μ μ°μ° νμκ° μ μ₯λ d[i]μ d[i//2] + 1μ λΉκ΅νμ¬ λ μμ λ°©λ²μ μ ννλ€λ μμ΄λμ΄μ΄λ€.
# 1μ λΊ κ²½μ° μ°μ° νμ
d[i] = d[i-1] +1
# 2λ‘ λλμ΄ λ¨μ΄μ§λ κ²½μ°
if i%2 ==0:
d[i] = min(d[i],d[i//2]+1)
μ 체 μ½λ
x = int(input())
d = [0] * 30001
for i in range(2,x+1):
d[i] = d[i-1] +1
if i%2 ==0:
d[i] = min(d[i],d[i//2]+1)
if i%3==0:
d[i] = min(d[i],d[i//3]+1)
if i%5==0:
d[i] = min(d[i],d[i//5]+1)
print(d[x])
2οΈβ£μ€μ λ¬Έμ 2 :κ°λ―Έ μ μ¬ λ¬Έμ νμ΄ κ³Όμ
ππ
μμ§ λ¬Έμ νμ΄λ₯Ό μ΄λ»κ² ν΄μΌν μ§ λ°λ‘ λ μ€λ₯΄μ§ μλλ€. νμ΄λ₯Ό λ³΄κ³ dp λ¬Έμ μ μ΅μν΄μ§μ!
n = int(input())
array = list(map(int,input().split()))
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])
π«±κ²½μ°μ μ
i-2 i-1 νμ¬
γ γ γ γ
1 ) i-2λ²μ§Έ μλμ ν΄λ€λ©΄ : νμ¬ μλμ νΈ μ μλ€.
2) i-1λ²μ§Έ μλμ ν΄λ€λ©΄ : νμ¬ μλμ νΈ μ μλ€.
μ¦ i-2λ²μ§Έ μλ + νμ¬ μλ VS i-1 λ²μ§Έ μλ μ€ λ λ§μ μλμ νΈ μ μλ κ²½μ°λ₯Ό μ ννλ©΄ λλ€.
π«±κ΅¬ν μμ
dλ λ λ§μ μλμ νΈ μ μλ κ²½μ°κ° μ μ₯λ dp ν μ΄λΈμ΄λ€.
μΈλ±μ€μ λ°λΌμ μ°¨λ‘λλ‘ νμ¬ μΈλ±μ€κΉμ§ μ€ κ°μ₯ μλμ λ§μ΄ νΈ μ μλ λ°©λ²μ΄ μ νλλ€.
for i in range(2,n):
d[i] = max(d[i-1], d[i-2] + array[i])
3οΈβ£μ€μ λ¬Έμ 3 : λ°λ₯ 곡μ¬
* νμΌλ§ λ¬Έμ
ꡬνκ³ μ νλ κ² : κ°λ‘ * μΈλ‘ = N * 2 μΈ λ°λ₯μ μ±μ°λ λͺ¨λ κ²½μ°μ μ
μΆλ ₯ : λ°λ₯μ μ±μ°λ λ°©λ²μ 796796μΌλ‘ λλ λλ¨Έμ§
n = int(input())
d = [0] * 1001
d[1]= 1
d[2]=3
for i in range(3,n+1):
d[i] = (d[i-1] + d[i-2] *2) % 796796
print(d[n])
κ·Όλ° μ½λκ° μ΄ν΄κ° μλλ€.
d[1] μ 1κ°μ§ κ²½μ°
d[2] μ 3κ°μ§ κ²½μ°κ° μλ€.
d[3] μ d[2] + d[1] * 2 = 5κ°μ§ κ²½μ°μ μλ₯Ό κ°μ§λ€.
d[4] λ d[3] + d[2] * 2 =11κ°μ§ μ κ²½μ°μ μλ₯Ό κ°μ§λ€.
μ΄ν΄κ° μκ°λ λΆλΆμ 2μΉΈμ΄ λ¨μμ λ κ°λ‘ * μΈλ‘ = 1*2 μΈ νμΌ 2κ°λ‘λ ꡬμ±ν μ μλλ° μ μ΄κ±΄ κ³ λ €νμ§ μμκΉ? μΆμλλ° μ΄κ±΄ 1μΉΈμ΄ λ¨μ κ²½μ°μμ κ³ λ €λλ κ²μ΄μλ€. ꡬμ±λλ νμΌ ννκ° λμΌνλ―λ‘ μ¬κΈ°μ κ³ λ €λλ κ²μ΄μλ€! π€
4οΈβ£μ€μ λ¬Έμ 4 : ν¨μ¨μ μΈ νν κ΅¬μ± λ¬Έμ νμ΄λ³΄κΈ°
μΌμ..... dp λ¬Έμ λ μ΄λ»κ² νμ΄μΌν μ§ νΌμμλ μμ§ κ°μ΄ μμ‘νλ€. λ¬Έμ νμ΄λ₯Ό λ¨κ³λ³λ‘ μ 리ν΄λ³΄μ!!!
μλ₯Ό λ€μ΄ N = 3μ΄κ³ K= 7μ΄λΌκ³ μκ°ν΄λ³΄μ ! μ¬κΈ°μ Kλ ννμ λ¨μλ₯Ό μλ―Ένλ€.
κ° ννμ λ¨μλ 2, 3, 5μ΄λ€.
π«± κ²½μ°μ μ
κΈμ‘ iλ₯Ό λ§λ€ μ μλ νν κ°μ ai, νν λ¨μ kλΌκ³ ν λ
a i-kλ κΈμ‘ i-kλ₯Ό λ§λ€ μ μλ μ΅μνμ νν κ°μ
ai-k λ₯Ό λ§λλ λ°©λ²μ΄ μ‘΄μ¬ν κ²½μ° : a i = min(ai, ai-k + 1)
- ai-kλ a[i]μ κΈμ‘ kλ₯Ό νλ λνλ©΄ λ§λ€ μ μλ€.
μ‘΄μ¬νμ§ μλ κ²½μ° : ai = 10,001
π«±μ΄κΈ° 리μ€νΈ μ€μ νκΈ°
κ° μΈλ±μ€λ₯Ό 10,001λ‘ μ€μ νλ€.
μ°λ¦¬ λ¬Έμ μμ κΈμ‘μ μ΅λκ°μ 10,000μ΄λ€. λ°λΌμ 10,001μ λΆκ°λ₯ν κΈμ‘μ΄λ€. μ¦, νΉμ κΈμ‘μ λ§λ€ μ μλ νν ꡬμ±μ΄ κ°λ₯νμ§ μλ€λ μλ―Έμ΄λ€.
0μμ κ²½μ°, ννλ₯Ό νλλ μ¬μ©νμ§ μμμ λ λ§λ€ μ μμΌλ―λ‘ 0μΈλ±μ€ κ°μΌλ‘ 0μ μ€μ νλ€.
π«±νν λ¨μ νμΈνκΈ°
νμ¬ μ°μ°μμ κ°μ₯ μ΅μμ κ°μΌλ‘ λ§λλ μ°μ°μ μ ννλ©΄ λλ€.
λ°λΌμ κ°μ₯ μ΅μλ‘ λ§λλ μ°μ°μ μ ννκ³ μ΄λ₯Ό λ°λ³΅ν΄μ μννλ©΄ λλ€.
κ°μ₯ λ¨Όμ 첫 λ²μ§Έ ννλ¨μμΈ 2λΆν° νμΈν΄λ³΄μ.
2λ‘ λ§λ€ μ μλ μλΆν° dp ν μ΄λΈμ κ°±μ νκΈ°
μΈλ±μ€ 2μ κ²½μ° 1μ΄λΌλ κ°μ κ°μ§λλ° μ΄λ 2μ μ§λ¦¬ νν νλλ₯Ό μ΄μ©νμ¬ 2μμ λ§λ€ μ μλ€λ μλ―Έμ΄λ€.
μΈλ±μ€ 4μ κ²½μ° 2λΌλ κ°μ κ°μ§λλ° μ΄λ 2μ μ§λ¦¬ νν 2κ°λ₯Ό μ΄μ©νμ¬ 2+2 = 4μμ λ§λ€ μ μλ€λ μλ―Έμ΄λ€.
λͺ μΈλ±μ€λ 10,001 κ°μ κ°μ§λλ°, μ΄λ 2μμΌλ‘ ꡬμ±ν μ μλ κΈμ‘μ΄κΈ° λλ¬Έμ΄λ€.
A2 = A0 + 1
A4 = A2 + 1
μ΄μ νν λ¨μ 3μ νμΈν΄λ³΄μ
2μ 3μΌλ‘ λ§λ€ μ μλ μλΆν° dp ν μ΄λΈμ κ°±μ νκΈ°
A5 = A2 + 1
μΈλ±μ€ 5λ 2λΌλ κ°μ κ°μ§λλ° μ΄λ 2μμ§λ¦¬ νν 1κ°, 3μμ§λ¦¬ νν 1κ°λ‘ 2 + 3 = 5μμ λ§λ€ μ μλ€λ μλ―Έμ΄λ€.
μ΄μ νν λ¨μ 5μ νμΈν΄λ³΄μ
2, 3, 5λ‘ λ§λ€ μ μλ μλΆν° dp ν μ΄λΈμ κ°±μ νκΈ°
A 7 = A2 + 1λ‘ 2λΌλ κ°μ κ°μ§λ€. 2μμ§λ¦¬ νν νλλ 5μμ§λ¦¬ νν 1κ°λ‘ 2 + 5 = 7μμ λ§λ€ μ μλ€λ μλ―Έμ΄λ€.
μλ μ΄μ λ¨κ³μμ A7μ κ°μ 3μ΄μλλ€, μ΄λ 2 + 2 + 3 = 7μμΌλ‘ 3κ°μ ννλ₯Ό μ¬μ©νμ λλ₯Ό λνλΈ κ²μ΄λ€.
κ·Έλ¬λ 2 + 5 = 7μμ λ§λ€λ©΄ ννλ₯Ό 2κ°λ§ μ¬μ©ν΄λ λλ―λ‘ κ°±μ λλ€.
κ²°κ³Όμ μΌλ‘ 7μμ λ§λ€κΈ° μν μ΅μμ νν κ°μλ 2κ°μ΄λ€.
# μ
λ ₯λ°κΈ°
n,m = int(input().split)
n_list=[]
for _ in range(n):
n_list.append(int(input().split()))
# νλ² κ³μ°λ κ²°κ³Όλ₯Ό μ μ₯νκΈ° μν DP ν
μ΄λΈ μ΄κΈ°ν
d = [100001] * (m+1)
# dp ꡬν
d[0]= 0
for i in range(n):
for j in range(n_list[i] , m + 1):
if d[j - n_list[i]] != 10001:
d[j] = min( d[j], d[ j - n_list[i] ] +1)
if d[m] == 10001:
print(-1)
else:
print(d[m])
μ΄ λ‘μ§μ λ€μ μ΄ν΄ν΄λ³΄μ ! ! !
μμμ μμλ³Έ κ²μ²λΌ νν λ¨μ λ³λ‘ dp ν μ΄λΈκ°±μ
for i in range(n):
for j in range(n_list[i] , m + 1):
if d[j - n_list[i]] != 10001:
d[j] = min( d[j], d[ j - n_list[i] ] +1)
μ¬κΈ°μ d[j - n_list[i]] μ n_list[i]λ₯Ό λνλ©΄ μνλ κΈμ‘μ΄ λλ€
λ°λΌμ d[j]μ μ΄μ κΈμ‘μ κΈμ‘μ λν΄μ μ»μ μ μ€ μμ κ²μ ννλ©΄ λλ€.
λ°±μ€μ 1,2,3 λ§λ€κΈ° λ¬Έμ νμ΄λ³΄κΈ°
https://www.acmicpc.net/problem/9095
test = int(input())
def sum_func(x):
if x==1:
return 1
elif x==2:
return 2
elif x==3:
return 4
else:
return sum_func(x-1) + sum_func(x-2) + sum_func(x-3)
for _ in range(0,test):
n = int(input())
print(sum_func(n))
κ·μΉμ μ°Ύμλ΄λ κ²μ΄ μ€μνλ€. κ·Έλ¦¬κ³ μ΄μ κ²°κ³Όλ₯Ό μ΄λ»κ² μ¬μ©ν μ μλμ§ μ μκ°ν΄λ³΄μ.
κ·μΉμ λͺ¨λ₯Ό λμλ νλ² n = 1μΌ λ 2μΌ λλ₯Ό μκ°ν΄λ³΄λ©° λμ΄ν΄λ³΄μ
n=4μΈ κ²½μ°
1, 2, 3μ λν΄μ λνλ΄λ €λ©΄ κ²½μ°λ μλ 3κ°μ§ μΌμ΄μ€λ‘ λλλ€.
1 + 3
1μ 3μ λνλ κ²½μ°μ μλ 3μ ꡬμ±νλ κ²½μ°μ μμ λμΌνλ€
μ¬κΈ°μλ 1 + 1+ 1 , 1 + 2, 2 + 1 , 3 μΌλ‘ 4κ°μ§ κ²½μ°κ° μλ€.
2 + 2
2μ 2μ λνλ κ²½μ°μ μλ 2μ ꡬμ±νλ κ²½μ°μ μμ λμΌνλ€
μ¬κΈ°μλ 1 + 1, 2 λ‘ 2κ°μ§ κ²½μ°κ° μλ€.
3 + 1
3μ 1μ λνλ κ²½μ°μ μλ 1μ ꡬμ±νλ κ²½μ°μ μμ λμΌνλ€
μ¬κΈ°μλ 1λ‘ 1κ°μ§ κ²½μ°κ° μλ€.
μ΄λ κ² μμ±ν΄λ³΄λ κ° κ²½μ°λ§λ€ κ·μΉμ μ μ μμλ€.
4λ₯Ό ꡬμ±νλ κ²½μ°μ μλ 3μ ꡬμ±νλ κ²½μ°μ μ + 2λ₯Ό ꡬμ±νλ κ²½μ°μ μ + 1μ ꡬμ±νλ κ²½μ°μ μ λ‘ ννλμλ€.
5λ₯Ό ꡬμ±νλ κ²½μ°μ μλ 4λ₯Ό ꡬμ±νλ κ²½μ°μ μ + 3μ ꡬμ±νλ κ²½μ°μ μ + 2λ₯Ό ꡬμ±νλ κ²½μ°μ μλ‘ ννλμλ€.
λ°λΌμ xλΌλ ν©μ ꡬμ±νλ κ²½μ°μ μλ μλμ κ°μ΄ ννν μ μλ€.
sum_func(x-1) + sum_func(x-2) + sum_func(x-3)