๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€ ๊ธฐ๋ก

[์ด์ฝ”ํ…Œ/python] ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋… ์ •๋ฆฌ & ๋ฌธ์ œ ํ’€์ด ๊ธฐ๋ก โž• ๋ฐฑ์ค€ dp ๋ฌธ์ œ ํ’€์ด

by hyeonha 2024. 5. 29.

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)

 

728x90