Computer Science/Algorithms

๐Ÿ›Dynamic Programming๐Ÿ›

metamong 2023. 1. 3.

intro

๐Ÿฅ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ ์‹œ๊ฐ„ ํšจ์œจ์„ฑ์„ ๋น„์•ฝ์ ์œผ๋กœ ํ–ฅ์ƒ. ์ด๋ฏธ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ(์ž‘์€ ๋ฌธ์ œ)๋Š” ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ €์žฅํ•˜์—ฌ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋„๋ก ํ•จ. ๋”ฐ๋ผ์„œ ์™„์ „ํƒ์ƒ‰์˜ ๋น„ํšจ์œจ์ ์ธ ์‹œ๊ฐ„ ๋ณต์žก๋„ ์„ฑ๋Šฅ ํ•œ๊ณ„์ ์„ ํ•ด๊ฒฐํ•ด์ค€๋‹ค. ๋˜ํ•œ '๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ = ๋™์ ๊ณ„ํš๋ฒ•'์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค. (๋™์ (dynamic) ํ• ๋‹น(allocation) - 'ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋„์ค‘์— ์‹คํ–‰์— ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ธฐ๋ฒ•'). DP ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ™œ์šฉํ•œ๋‹ค๋ฉด ์—ฌ๋Ÿฌ sub-problem ํฌํ•จ ๋ชจ๋“  ๋ฌธ์ œ์˜ ์ •๋‹ต์ด ๋“ค์–ด๊ฐ€๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฏธ๋ฆฌ ๋ฐฐ์น˜(์ด ๋•Œ ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋“ค์˜ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋Š” ์ €์žฅ์šฉ list๋Š” dp-table). DP ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜ ๋‘๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค.

 

โ‘  ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ(Optimal Substructure) - ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž‘์€ ๋ฌธ์ œ์˜ ๋‹ต์„ ๋ชจ์•„์„œ ํฐ ๋ฌธ์ œ ํ•ด๊ฒฐ

โ‘ก ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ (Overlapping Subproblem) - ๋™์ผํ•œ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•ด๊ฒฐ

 

๐Ÿฅ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ตฌํ˜„์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹ → top-down(์œ„์—์„œ ์•„๋ž˜-ํ•˜ํ–ฅ์‹) & bottom-up(์•„๋ž˜์—์„œ ์œ„-์ƒํ–ฅ์‹)์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

โ‘  top-down (ํ•˜ํ–ฅ์‹)

: dp ๊ตฌํ˜„๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ, ํ•œ ๋ฒˆ ๊ณ„์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„(ํ…Œ์ด๋ธ”, ์บ์‹œ, dp)์— ๋ฉ”๋ชจ ํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. ์ฆ‰, ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ”๋ชจํ–ˆ๋˜ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ค๊ณ , ๊ฐ’์„ ๊ธฐ๋กํ•ด ๋†“๋Š”๋‹ค๋Š” ์ ์—์„œ caching์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘๊ฒŒ ๋‚˜๋ˆ„์–ด ํ‘ธ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฃผ๋กœ ์žฌ๊ท€๊ฐ€ ์‚ฌ์šฉ(์ด ๊ณผ์ •์—์„œ ํ•œ๋ฒˆ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋Š” ๊ธฐ๋กํ•˜๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ง„ํ–‰. ์ฆ‰, ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด๋ž€, ์ด์ „์— ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ๊ธฐ๋กํ•ด ๋†“๋Š” ๊ฐœ๋…์„ ๋œปํ•œ๋‹ค์—ฌ๊ธฐ์„œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด๋ž€ ํ•œ ๋ฒˆ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์•„ ๋†“๊ธฐ๋งŒ ํ•˜๊ณ  dp๋ฅผ ์œ„ํ•ด ํ™œ์šฉํ•˜์ง€๋„ ์•Š์„ ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ ์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด ๋ฉ”๋ชจ์ด์ œ์ด์…˜๊ณผ dp๋Š” ๊ฐ™์€ ๊ฐœ๋…์ด ์•„๋‹ˆ๋‹ค. ํ˜ผ๋™ํ•˜์ง€ ๋ง์ž.

โ‘ก bottom-up (์ƒํ–ฅ์‹)

: ์•„๋ž˜์ชฝ์—์„œ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ๋จผ์ € ์ฐจ๊ทผ์ฐจ๊ทผ ํ•ด๊ฒฐํ•ด๋‚˜๊ฐ€๋ฉด์„œ ๊ทธ ๋‹ค์Œ์˜ ๋ฌธ์ œ๊นŒ์ง€ ์ฐจ๋ก€๋กœ ํ•ด๊ฒฐํ•ด ๋‚˜๊ฐ€๋Š” ๊ณผ์ •์„ ๋œปํ•œ๋‹ค. ๋ฐ˜๋ณต๋ฌธ์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, dp์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ฆ‰ '์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•˜์œ„ ๋ฌธ์ œ๋ฅผ ๋จผ์ € ํ‘ผ ํ›„ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์Œ“์•„์˜ฌ๋ ค ์ฃผ์–ด์ง„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜'์ด๋‹ค. ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ์ ํ™”์‹์„ ์ฐพ์•„๋‚ธ ํ›„, ์ ํ™”์‹์˜ ํ•ญ์„ ๋ฐ‘์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๊ตฌํ•ด๋‚˜๊ฐ€์„œ ๋‹ต์„ ์•Œ์•„๋‚ด๋Š” ํ˜•ํƒœ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜

fibonacci

๐Ÿฅ ํ”ผ๋ณด๋‚˜์น˜๋Š” 1,1,2,3,5,8,13,21,34,55,89, .... ์™€ ๊ฐ™์€ ์ˆ˜์—ด์ด๋‹ค. ์ ํ™”์‹์€ $a_n = a_{n-1} + a_{n-2}, a_1 = 1, a_2 = 1$ n๋ฒˆ์งธ fibonacci ์ˆ˜๋ฅผ f(n)์ด๋ผ๊ณ  ํ•  ๋•Œ 4๋ฒˆ์งธ fibonacci ์ˆ˜ $f(4)$๋ฅผ ๊ตฌํ•˜๋Š” ๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ์ด ๋•Œ fibonacci ์ˆ˜๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ f(n)๋กœ ๋‚˜๋ˆ„์–ด์ง€๋ฏ€๋กœ โ‘  ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ ์กฐ๊ฑด์„ ๋งŒ์กฑ. ์•„๋ž˜ ์˜ค๋ฅธ์ชฝ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋™์ผํ•œ f๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉ. ๋”ฐ๋ผ์„œ  โ‘ก ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„ ์กฐ๊ฑด๋„ ๋งŒ์กฑ. ์˜ˆ๋ฅผ ๋“ค์–ด f(6)์„ ๊ตฌํ•˜๋Š” ๊ณผ์ •์—์„œ f(2)๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœ๋œ๋‹ค. ๋”ฐ๋ผ์„œ dp๋ฅผ ์‚ฌ์šฉํ•ด ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœ๋˜๋Š” f(2)๋ฅผ ํ•œ ๋ฒˆ๋งŒ ๊ณ„์‚ฐํ•ด์„œ ๋ณ„๋„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ด ์ดํ›„ f(2)๊ฐ€ ๊ณ„์† ๊ณ„์‚ฐ๋˜๋Š” ๋‚ญ๋น„๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿฅ ์˜ˆ๋ฅผ ๋“ค์–ด f(99)๋ฅผ ๊ตฌํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โ‘  top-down ๋ฐฉ์‹ - ์žฌ๊ท€์‚ฌ์šฉ, ํ•จ์ˆ˜ ์ข…๋ฃŒ ์กฐ๊ฑด

#dp-table initialization
d=[0]*100

#fibonacci recursive function (top-down dp)
def fibo(x):
    #exit
    if x==1 or x==2: return 1

    #if sub-problem already solved, get the answer
    if d[x]!=0:return d[x]

    #if not solved, add the results
    d[x]=fibo(x-1)+fibo(x-2)
    return d[x]
    
print(fibo(99))#218922995834555169026

: ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฒฐ๊ณผ ์œ„ ์ƒ‰์น ๋œ ๋…ธ๋“œ๋งŒ ๋ฐฉ๋ฌธ๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ๋ฒ• ์‚ฌ์šฉ ์‹œ fibonacci ์ˆ˜์—ด ํ•จ์ˆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N) ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์˜ ์ง€์ˆ˜ ํ˜•ํƒœ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์„ ํ˜• ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

 

โ‘ก bottom-up ๋ฐฉ์‹ - ๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉ, ์ฒซ ํ•ญ ์„ค์ •

d=[0]*100

d[1],d[2]=1,1
n=99

#bottom-up dp
for i in range(3,n+1):
    d[i]=d[i-1]+d[i-2]
print(d[n]) #218922995834555169026

dp vs divide-conquer 

๐Ÿฅ dp์™€ ๋ถ„ํ• ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ชจ๋‘ ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์งˆ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค(์œ„ ์กฐ๊ฑด โ‘ ). ์ฆ‰, ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž‘์€ ๋ฌธ์ œ์˜ ๋‹ต์„ ๋ชจ์•„์„œ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด dp ๋˜๋Š” ๋ถ„ํ• ์ •๋ณต์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด ์ถฉ์กฑ. ๊ทธ๋Ÿฌ๋‚˜ dp๋ฌธ์ œ์—์„œ๋Š” ๊ฐ ๋ถ€๋ถ„ ๋ฌธ์ œ๋“ค์ด ์„œ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉฐ ๋ถ€๋ถ„ ๋ฌธ์ œ๊ฐ€ ์ค‘๋ณต๋œ๋‹ค(์œ„ ์กฐ๊ฑดโ‘ก) / ๊ทธ๋Ÿฌ๋‚˜ ๋ถ„ํ•  ์ •๋ณต ๋ฌธ์ œ๋Š” ๋™์ผํ•œ ๋ถ€๋ถ„ ๋ฌธ์ œ๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ณ„์‚ฐ๋˜์ง€ ์•Š๋Š”๋‹ค. ์—ฌ๋Ÿฌ ๋ถ„ํ•  ๋ฌธ์ œ๋Š” ์„œ๋กœ ๋ณ„๊ฐœ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ถ„ํ•  ์ •๋ณต ๋Œ€ํ‘œ ๋ฌธ์ œ์ธ quick sort ๋ฌธ์ œ๋Š”, ํ•œ ๋ฒˆ ๊ธฐ์ค€ ์›์†Œ(pivot)๊ฐ€ ์ž๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ ์ž๋ฆฌ๋ฅผ ์žก์œผ๋ฉด, ํ•ด๋‹น ์›์†Œ์˜ ์œ„์น˜๋Š” ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ๋ถ„ํ•  ์ดํ›„ ํ•ด๋‹น pivot์„ ๋‹ค์‹œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ๋Š” ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ dp๋Š” ์—ฌ๋Ÿฌ sub-problem์˜ ๊ฒฐ๊ณผ๋กœ ๋‹ค๋ฅธ sub-problem ํ•ด๊ฒฐ์˜ ์‹ค๋งˆ๋ฆฌ๊ฐ€ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ dp ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•œ ์ ‘๊ทผ ์ˆœ์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

โ‘  ์ฃผ์–ด์ง„ ๋ฌธ์ œ๊ฐ€ dp ์œ ํ˜•์ž„์„ ํŒŒ์•… - ์ตœ์ ๋ถ€๋ถ„๊ตฌ์กฐ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ง€ / ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ง€. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ฆฌ๋”” / ๊ตฌํ˜„ / ์™„์ „ํƒ์ƒ‰ ๋“ฑ์˜ ์•„์ด๋””์–ด๋กœ ๋จผ์ € ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ง€ ๊ฒ€ํ† 

โ‘ก dp-table initialization

โ‘ข ๊ฐ ํ•ญ๊ณผ์˜ ๊ด€๊ณ„ ์ ํ™”์‹์„ ์ฐพ๊ธฐ

โ‘ฃ ์ดˆ๊นƒ๊ฐ’ ์ •์˜: ์ผ๋ฐ˜์ ์œผ๋กœ bottom-up ๋ฐฉ์‹์˜ dp์œ ํ˜•์ด ๋งŽ์ด ์ถœ์ œ๋˜๋ฏ€๋กœ ์ดˆ๊นƒ๊ฐ’์„ ์ ์ ˆํžˆ ์ •์˜ํ•œ ๋‹ค์Œ ์•„๋ž˜์—์„œ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๋ฉฐ ๊ฐ’์„ ์ญ‰ ๊ตฌํ•ด๋‚˜๊ฐ€๋ฉด ๋œ๋‹ค.

dp exercises

Q. ๊ฐœ๋ฏธ ์ „์‚ฌ

Q. ๊ฐœ๋ฏธ ์ „์‚ฌ๋Š” ๋ถ€์กฑํ•œ ์‹๋Ÿ‰์„ ์ถฉ๋‹นํ•˜๊ณ ์ž ๋ฉ”๋šœ๊ธฐ ๋งˆ์„์˜ ์‹๋Ÿ‰ ์ฐฝ๊ณ ๋ฅผ ๋ชฐ๋ž˜ ๊ณต๊ฒฉํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋šœ๊ธฐ ๋งˆ์„์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์‹๋Ÿ‰์ฐฝ๊ณ ๊ฐ€ ์žˆ๋Š”๋ฐ ์‹๋Ÿ‰์ฐฝ๊ณ ๋Š” ์ผ์ง์„ ์œผ๋กœ ์ด์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์‹๋Ÿ‰ ์ฐฝ๊ณ ์—๋Š” ์ •ํ•ด์ง„ ์ˆ˜์˜ ์‹๋Ÿ‰์„ ์ €์žฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ฐœ๋ฏธ ์ „์‚ฌ๋Š” ์‹๋Ÿ‰์ฐฝ๊ณ ๋ฅผ ์„ ํƒ์ ์œผ๋กœ ์•ฝํƒˆํ•˜์—ฌ ์‹๋Ÿ‰์„ ๋นผ์•—์„ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์ด ๋•Œ ๋ฉ”๋šœ๊ธฐ ์ •์ฐฐ๋ณ‘๋“ค์€ ์ผ์ง์„ ์ƒ์— ์กด์žฌํ•˜๋Š” ์‹๋Ÿ‰์ฐฝ๊ณ  ์ค‘์—์„œ ์„œ๋กœ ์ธ์ ‘ํ•œ ์‹๋Ÿ‰์ฐฝ๊ณ ๊ฐ€ ๊ณต๊ฒฉ๋ฐ›์œผ๋ฉด ๋ฐ”๋กœ ์•Œ์•„์ฑŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฏธ ์ „์‚ฌ๊ฐ€ ์ •์ฐฐ๋ณ‘์—๊ฒŒ ๋“คํ‚ค์ง€ ์•Š๊ณ  ์‹๋Ÿ‰์ฐฝ๊ณ ๋ฅผ ์•ฝํƒˆํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ตœ์†Œํ•œ ํ•œ ์นธ ์ด์ƒ ๋–จ์–ด์ง„ ์‹๋Ÿ‰์ฐฝ๊ณ ๋ฅผ ์•ฝํƒˆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์‹๋Ÿ‰์ฐฝ๊ณ  4๊ฐœ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ์‹œ๋‹ค. {1,3,1,5}

์ด ๋•Œ ๊ฐœ๋ฏธ ์ „์‚ฌ๋Š” ๋‘ ๋ฒˆ์งธ ์‹๋Ÿ‰์ฐฝ๊ณ ์™€ ๋„ค ๋ฒˆ์งธ ์‹๋Ÿ‰์ฐฝ๊ณ ๋ฅผ ์„ ํƒํ–ˆ์„ ๋•Œ ์ตœ๋Œ“๊ฐ’์ธ ์ด 8๊ฐœ์˜ ์‹๋Ÿ‰์„ ๋นผ์•—์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฏธ ์ „์‚ฌ๋Š” ์‹๋Ÿ‰์ฐฝ๊ณ ๊ฐ€ ์ด๋ ‡๊ฒŒ ์ผ์ง์„ ์ƒ์ผ ๋•Œ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ์‹๋Ÿ‰์„ ์–ป๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฏธ ์ „์‚ฌ๋ฅผ ์œ„ํ•ด ์‹๋Ÿ‰์ฐฝ๊ณ  N๊ฐœ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์‹๋Ÿ‰์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์„ธ์š”.

#my answer
N=int(input())

counts=list(map(int,input().split()))
an=[0]*N #dp-table initialization

for n in range(N):
    if n==0: an[0] = counts[n]
    elif n==1: an[1] = max(an[0],counts[n])
    else:
        an[n] = max(an[n-1],an[n-2]+counts[n]) #an 
print(an[-1])

#answer
n=int(input())
array=list(map(int,input().split()))

#dp-table initialization
d = [0]*100

#bottom-up dp
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])

 

๐Ÿฅ ๋ฌธ์ œ์— ์˜ํ•ด, ๊ฐ ์ฐฝ๊ณ ๋ณ„๋กœ ์ตœ๋Œ€๋กœ ํ„ธ ์ˆ˜ ์žˆ๋Š” ์‹๋Ÿ‰์˜ ๊ฐœ์ˆ˜๋ฅผ a(n)์ด๋ผ๊ณ  ํ•˜์ž. ๊ทธ๋ ‡๋‹ค๋ฉด n๋ฒˆ์งธ ์‹๋Ÿ‰ ์ฐฝ๊ณ ์—์„œ ์•„๋ž˜ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜ ์ค‘ ์ตœ๋Œ“๊ฐ’์€ a(n)

a(n) = max(a(n-1), a(n-2)+n)

 

๐Ÿฅ ์œ„ ๋ฌธ์ œ๋Š” dp๋ฌธ์ œ๋กœ ๋‘ ๊ฐ€์ง€ dp ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ๋‹ค. โ‘  ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ - ์œ„์˜ ๋‘๊ฐ€์ง€ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ๋งŒ ์ตœ์ ์˜ ์†”๋ฃจ์…˜์„ ๊ตฌํ•˜๋ฏ€๋กœ ์„ฑ๋ฆฝ / โ‘ก ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„ ๊ตฌ์กฐ - ์œ„ ์ ํ™”์‹ ์ˆ˜์—ด์— ์˜ํ•ด ๊ณ„์† a(n)์„ ํ˜ธ์ถœํ•  ๋•Œ ์•ž์—์„œ ๊ณ ๋ ค๋œ a(n-1)๊ณผ a(n-2)๊ฐ€ ์ค‘๋ณต์œผ๋กœ ๊ณ ๋ ค๋˜๋ฏ€๋กœ ์กฐ๊ฑด ์„ฑ๋ฆฝ. ๋˜ํ•œ ์ด๋Š” bottom-up ์ƒํ–ฅ์‹ dp ๋ฌธ์ œ๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค. a[0]์ผ๋•Œ๋ถ€ํ„ฐ ์ตœ์ข… a[n]๊นŒ์ง€ ๊ณ„์† ์ˆ˜์—ด ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— bottom-up ์ƒํ–ฅ์‹ dp ๊ตฌ์กฐ ๋ฌธ์ œ. ์ด๋ ‡๊ฒŒ dp๋ฌธ์ œ๋Š” ๋ฌธ์ œ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์ ํ™”์‹์„ ์„ธ์šด ๋’ค, bottom-up ๋ฐฉ์‹์œผ๋กœ ์ตœ์ข… ์ˆ˜์—ด๊ฐ’ a(n)์„ ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“  dp-table์—์„œ ๊ตฌํ•˜๋Š” ์œ ํ˜•์ด ๋งค์šฐ ๋นˆ๋ฒˆํžˆ ๋“ฑ์žฅํ•˜๋ฏ€๋กœ ๊ธฐ์–ต

Q. 1๋กœ ๋งŒ๋“ค๊ธฐ

Q. ์ •์ˆ˜ X๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ •์ˆ˜ X์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์—ฐ์‚ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด 4๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. (1) X๊ฐ€ 5๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฉด, 5๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. (2) X๊ฐ€ 3์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฉด, 3์œผ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. (3) X๊ฐ€ 2๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฉด, 2๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. (4) X์—์„œ 1์„ ๋บ๋‹ˆ๋‹ค.

์ •์ˆ˜ X๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์—ฐ์‚ฐ 4๊ฐœ๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•ด์„œ ๊ฐ’์„ 1๋กœ ๋งŒ๋“ค๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ํšŸ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด ์ •์ˆ˜๊ฐ€ 26์ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ณ„์‚ฐํ•ด์„œ 3๋ฒˆ์˜ ์—ฐ์‚ฐ์ด ์ตœ์†Ÿ๊ฐ’์ž…๋‹ˆ๋‹ค.

26 → 25 → 5 → 1

 

#bottom-up dp
n=int(input())
if n==1:print(0)
elif n==2 or n==3:print(1)
elif n==4:print(2)
else:
    dp=[0]*(n+1)
    dp[2],dp[3],dp[5]=1,1,1
    cnt=0
    for i in range(4,n+1):
        a,b,c,d=30001,30001,30001,30001
        if i%5==0:
            a=dp[i//5]
        if i%3==0:
            b=dp[i//5]
        if i%2==0:
            c=dp[i//2]
        d=dp[i-1]
        dp[i]=min(a,b,c,d)+1
    print(dp[n])

 

๐Ÿฅ ์ด ๋ฌธ์ œ๋„ dp์˜ ๋‘๊ฐ€์ง€ ์กฐ๊ฑด(์ตœ์  ๋ถ€๋ถ„๊ตฌ์กฐ, ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„)์„ ๋ชจ๋‘ ๋งŒ์กฑํ•œ๋‹ค. ์ค‘์š”ํ•œ ๊ฑด, greedy ์œ ํ˜•๊ณผ๋Š” ๋‹ค๋ฅด๋‹ค๋Š” ์ ! greedy์˜ ๊ฒฝ์šฐ ๊ทธ ์–ด๋–ค ์ƒํ™ฉ์ด์–ด๋„ 5๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒฝ์šฐ๊ฐ€ 1์„ ๋นผ๋Š” ๊ฒฝ์šฐ๋ณด๋‹ค ๋งค ์ƒํ™ฉ์—์„œ ์šฐ์„ ์‹œ๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ, ํ•ด๋‹น ๋ฌธ์ œ๋Š” 1์„ ๋จผ์ € ๋นผ๊ณ  ๋‚œ ๋‹ค์Œ์˜ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ๋จผ์ € 5๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒฝ์šฐ์˜ ๊ฒฐ๊ณผ๋ณด๋‹ค ๋” ์ตœ์ ์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ greedy๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค. greedy ์œ ํ˜•์€ ์—ฌ๋Ÿฌ ์ƒํ™ฉ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ์ตœ์ ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ์ƒํ™ฉ์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์กด์žฌํ•  ๋•Œ ์“ธ ์ˆ˜ ์žˆ์Œ ์ ํ™”์‹์„ ์„ธ์›Œ๋ณด๋ฉด, a(i)๋ฅผ 1๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋ผ ์ •์˜ํ–ˆ์„ ๋•Œ,

 

a(i) = min(a(i-1), a(i/2), a(i/3), a(i/5)+1)

(๋‹จ, 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])

 

Q. ํšจ์œจ์ ์ธ ํ™”ํ ๊ตฌ์„ฑ

Q. N๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ํ™”ํ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ™”ํ๋“ค์˜ ๊ฐœ์ˆ˜๋ฅผ ์ตœ์†Œํ•œ์œผ๋กœ ์ด์šฉํ•ด์„œ ๊ทธ ๊ฐ€์น˜์˜ ํ•ฉ์ด M์›์ด ๋˜๋„๋ก ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ๊ฐ ์ข…๋ฅ˜์˜ ํ™”ํ๋Š” ๋ช‡ ๊ฐœ๋ผ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 2์›, 3์› ๋‹จ์œ„์˜ ํ™”ํ๊ฐ€ ์žˆ์„ ๋•Œ๋Š” 15์›์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด 3์›์„ 5๊ฐœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ตœ์†Œํ•œ์˜ ํ™”ํ ๊ฐœ์ˆ˜์ž…๋‹ˆ๋‹ค. M์›์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ตœ์†Œํ•œ์˜ ํ™”ํ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์„ธ์š”.

 

๐Ÿฅ ์ ํ™”์‹ idea: ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ธˆ์•ก์—์„œ, ๋‘ ํ™”ํ ์ข…๋ฅ˜ 2์™€ 3์ด ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ, 5๋ฅผ 2์™€ 3์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ๊ฐ€์ง“์ˆ˜๋Š” ํ˜„์žฌ ์œ„์น˜์—์„œ 2์™€ 3์„ ๋บ€ ๊ฐ๊ฐ์˜ ์ตœ์†Ÿ๊ฐ’์— 1์„ ๋”ํ•œ ๊ฒฐ๊ณผ์ด๋‹ค. ์ฆ‰, ํ˜„์žฌ ๊ธˆ์•ก์—์„œ ํ™”ํ ๋‹จ์œ„๋ฅผ ๊ฐ๊ฐ ๋บ€ ๊ฒฝ์šฐ์˜ dp table ๊ฐ’์˜ ์ตœ์†Ÿ๊ฐ’์—์„œ 1์„ ๋”ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ํ™”ํ ๋‹จ์œ„๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ๊ฐ€์ง“์ˆ˜๋กœ dp-table์„ updateํ•  ์ˆ˜ ์žˆ๋‹ค.

N,M=map(int,input().split())
dp=[M+1]*(M+1)
coins=[]
i=0
for _ in range(N):
    coin=int(input())
    coins.append(coin)
    i=coin
    if coin<=M:dp[coin]=1

#dp-table initialization from i+1
for cur_coin in range(i+1,M+1):
    cur_min=M+1
    for c in coins:
        if cur_min>dp[cur_coin-c]:
            cur_min=dp[cur_coin-c]
    dp[cur_coin]=cur_min+1    
print(dp)
print(-1 if dp[-1]>M else dp[-1])

 

๐Ÿฅ ๋จผ์ € ํ™”ํ๋‹จ์œ„์— ํ•ด๋‹นํ•˜๋Š” dp table ์นธ์— 1 ๋ฐฐ์น˜. ๊ทธ๋ฆฌ๊ณ  i+1(ํ™”ํ ๋‹จ์œ„ ์ตœ๋Œ“๊ฐ’+1)๋ถ€ํ„ฐ ๋ณธ๊ฒฉ์ ์œผ๋กœ dp table ์ง„ํ–‰ ์‹œ์ž‘ํ•œ๋‹ค. ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ํ˜„์žฌ ๊ธˆ์•ก์—์„œ ๊ฐ๊ฐ ํ™”ํ ๋‹จ์œ„๋ฅผ ๋บ€ ๊ฒฝ์šฐ ์ค‘ ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ์•˜๋‹ค๋ฉด, ํ•ด๋‹น ์ตœ์†Ÿ๊ฐ’์—์„œ 1์„ ๋”ํ•œ ๊ฐ’์„ dp table์— ์—…๋ฐ์ดํŠธํ•œ๋‹ค. inf๊ฐ’ ๋„˜์—ˆ์œผ๋ฉด ํ™”ํ๋‹จ์œ„๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์—†๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ -1 ์ถœ๋ ฅ, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์ตœ์ข… ๊ฐ’ ์ถœ๋ ฅ. a(i)๋ฅผ ๊ธˆ์•ก i๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œํ•œ์˜ ํ™”ํ ๊ฐœ์ˆ˜๋ผ๊ณ  ํ•˜์ž. ์ ํ™”์‹์€ ๊ฐ ํ™”ํ ๋‹จ์œ„์ธ k๋ฅผ ํ•˜๋‚˜์”ฉ ํ™•์ธํ•˜๋ฉฐ a(i-k)๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค๋ฉด a(i) = min(a(i), a(i-k)+1). ๊ทธ๋ฆฌ๊ณ  a(i-k)๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋Š” a(i-k) = ์„ค์ •

n,m=map(int,input().split())

array=[]
for i in range(n):array.append(int(input()))

#dp table
d=[10001]*(m+1)

#dp (bottom-up)
d[0]=0
for i in range(n):
    for j in range(array[i],m+1):
        if d[j-array[i]]!=10001:#if exists
            d[j]=min(d[j],d[j-array[i]]+1)

if d[m]==10001:print(-1)
else: print(d[m])

Q. ๊ธˆ๊ด‘

Q. nxm ํฌ๊ธฐ์˜ ๊ธˆ๊ด‘์ด ์žˆ๋‹ค. ๊ธˆ๊ด‘์€ 1 x 1 ํฌ๊ธฐ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ์œผ๋ฉฐ, ๊ฐ ์นธ์€ ํŠน์ •ํ•œ ํฌ๊ธฐ์˜ ๊ธˆ์ด ๋“ค์–ด ์žˆ๋‹ค. ์ฑ„๊ตด์ž๋Š” ์ฒซ๋ฒˆ์งธ ์—ด๋ถ€ํ„ฐ ์ถœ๋ฐœํ•˜์—ฌ ๊ธˆ์„ ์บ๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. ๋งจ ์ฒ˜์Œ์—๋Š” ์ฒซ ๋ฒˆ์งธ ์—ด์˜ ์–ด๋Š ํ–‰์—์„œ๋“  ์ถœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค. ์ดํ›„์— m-1๋ฒˆ์— ๊ฑธ์ณ์„œ ๋งค๋ฒˆ ์˜ค๋ฅธ์ชฝ ์œ„, ์˜ค๋ฅธ์ชฝ, ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ 3๊ฐ€์ง€ ์ค‘ ํ•˜๋‚˜์˜ ์œ„์น˜๋กœ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ฑ„๊ตด์ž๊ฐ€ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ธˆ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์ž.

 

for _ in range(int(input())):
    n,m=map(int,input().split())
    l=list(map(int,input().split()))
    golds=[]
    digs=[[0]*m for _ in range(n)]
    length=len(l)
    j,ans=0,0

    #2-dimensional array (golds)
    for i in range(0,length+1,m):
        if j==n:break
        golds.append(l[i:i+m])
        j+=1

    #assign first col    
    for i in range(0,n):
        digs[i][0] = golds[i][0]

    #dp-table - digs (bottom-up)
    for col in range(1,m):
        for row in range(0,n):
            if row==0:
                digs[row][col]=max(digs[row][col-1],digs[row+1][col-1])+golds[row][col]
            elif row==(n-1):
                digs[row][col]=max(digs[row][col-1],digs[row-1][col-1])+golds[row][col]
            else:
                digs[row][col]=max(digs[row][col-1],digs[row+1][col-1],digs[row-1][col-1])+golds[row][col]
    
    #find the maximum value of the last column of 'digs'
    for i in range(0,n):
        ans=max(ans,digs[i][-1])
    print(ans)

 

(์˜ค๋ฅธ์ชฝ ๊ทธ๋ฆผ) dp 2์ฐจ์› ๋ฐฐ์—ด ํ• ๋‹น ๊ณผ์ •

 

๐Ÿฅ 2์ฐจ์› ๋ฐฐ์—ด์„ ๋‹ค๋ฃจ์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์ด๋ฏ€๋กœ ์•ž์„  ๋ฌธ์ œ๋ณด๋‹ค ์•ฝ๊ฐ„ ๋‚œ์ด๋„๊ฐ€ ๋†’์•˜๋‹ค. digs๋ผ๋Š” dp-table์„ ๋งŒ๋“ ๋‹ค. ์ด ๋•Œ golds[i][j] = iํ–‰ j์—ด์— ์กด์žฌํ•˜๋Š” ๊ธˆ์˜ ์–‘, digs[i][j] = iํ–‰ j์—ด๊นŒ์ง€์˜ ์ตœ์ ์˜ ํ•ด๋Š” ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ธˆ์˜ ์ตœ๋Œ“๊ฐ’์œผ๋กœ ์„ค์ •.

 

โ‘  1์—ด๊ณผ ๋งˆ์ง€๋ง‰ ์—ด์ด ์•„๋‹Œ ๋ชจ๋“  ์—ด์˜ ์ตœ์ ์˜ ๊ธˆ์˜ ์–‘ ๊ตฌํ•˜๊ธฐ

digs[i][j] = golds[i][j] + max(golds[i-1][j-1], golds[i][j-1], golds[i+1][j-1])

 

โ‘ก 1์—ด์˜ ์ตœ์ ์˜ ๊ธˆ์˜ ์–‘ ๊ตฌํ•˜๊ธฐ ์ ํ™”์‹

digs[i][j] = golds[i][j] + max(golds[i][j-1], golds[i+1][j-1])

 

โ‘ข ๋งˆ์ง€๋ง‰ ์—ด์˜ ์ตœ์ ์˜ ๊ธˆ์˜ ์–‘ ๊ตฌํ•˜๊ธฐ ์ ํ™”์‹

digs[i][j] = golds[i][j] + max(golds[i-1][j-1], golds[i][j-1])

 

๐Ÿฅ ๋ณ„๋„์˜ dp-table์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ํ•œ dp table update

for tc in range(int(input())):
    #mine info
    n,m=map(int,input().split())
    array=list(map(int,input().split()))

    #dp-table initialization
    dp=[]
    index=0

    for i in range(n):
        dp.append(array[index:index+m])
        index+=m
    
    #dp(bottom-up)
    for j in range(1,m):
        for i in range(n):
            #from upper-left
            if i==0: left_up=0
            else: left_up=dp[i-1][j-1]

            #from lower-left
            if i==n-1:left_down=0
            else: left_down=dp[i+1][j-1]

            #from left
            left=dp[i][j-1]
            
            #dp-table update
            dp[i][j]=dp[i][j]+max(left_up, left_down, left)
        res=0
        for i in range(n):
            res=max(res,dp[i][m-1])
        print(res)

์ด์ฝ”ํ…Œ 2021

BaaarkingDog

 

'Computer Science > Algorithms' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๐Ÿซ‚ Prefix Sum  (0) 2023.01.18
Regular Expression  (0) 2023.01.11
bitmasking  (0) 2022.12.20
๐Ÿ‘€ Binary Search ๐Ÿ‘€  (2) 2022.12.06
understanding pesudo-code of QuickSort  (0) 2022.12.05

๋Œ“๊ธ€