์ฐธ๊ณ ์๋ฃ : ์ด๊ฒ์ด ์ฝ๋ฉ ํ ์คํธ๋ค (๋๋๋น ์ )
1. ์ค๋ณต๋๋ ์ฐ์ฐ์ ์ค์ด์
- ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋ ์ ์๋ค.
- ์์ ๋ฌธ์ ์์ ๊ตฌํ ์ ๋ต์ ๊ทธ๊ฒ์ ํฌํจํ๋ ํฐ ๋ฌธ์ ์์๋ ๋์ผํ๋ค.
- ๋ฉ๋ชจ์ด์ ์ด์ : DP๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ก, ํ ๋ฒ ๊ตฌํํ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํด๋๊ณ ๊ฐ์ ์์ ๋ค์ ํธ์ถํ๋ฉด ๋ฉ๋ชจํ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์ค๋ ๊ธฐ๋ฒ์ด๋ค. -> ํ๋ค์ด์์ ์ฌ์ฉ (์บ์ฑ์ด๋ผ๊ณ ๋ ํ๋ค.)
- Top-Down : ์ฌ๊ทํจ์๋ฅผ ์ด์ฉํ์ฌ DP ์ฝ๋ ์์ฑ
- Bottom-Ip : ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํ์ฌ ์์ค์ฝ๋ ์์ฑ (DP ํ ์ด๋ธ ์ฌ์ฉ) => ๊ถ์ฅ
- DP ๋ฌธ์ ๋ฅผ ํธ๋ ์ฒซ ๋จ๊ณ๋ DP ์ ํ์ธ์ง ํ์ ํ๋ ๊ฒ์ด๋ค.
2. 1๋ก ๋ง๋ค๊ธฐ
๋์ด๋ ์คํ
๋ฌธ์
์ ์ X์ ์ฌ์ฉํ ์ ์๋ ์ฐ์ฐ์ ๋ค์๊ณผ ๊ฐ์ด ์ธ ๊ฐ์ง ์ด๋ค.
- X๊ฐ 5๋ก ๋๋์ด ๋จ์ด์ง๋ฉด, 5๋ก ๋๋๋ค.
- X๊ฐ 3์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ฉด, 3์ผ๋ก ๋๋๋ค.
- X๊ฐ 2๋ก ๋๋์ด ๋จ์ด์ง๋ฉด, 2๋ก ๋๋๋ค.
- 1์ ๋บ๋ค.
์ ์ N์ด ์ฃผ์ด์ก์ ๋, ์์ ๊ฐ์ ์ฐ์ฐ ์ธ ๊ฐ๋ฅผ ์ ์ ํ ์ฌ์ฉํด์ 1์ ๋ง๋ค๋ ค๊ณ ํ๋ค. ์ฐ์ฐ์ ์ฌ์ฉํ๋ ํ์์ ์ต์๊ฐ์ ์ถ๋ ฅํ์์ค.
ํด์ค
์ด ๋ฌธ์ ๋ ์ ์๋ ค์ง DP ๋ฌธ์ ์ด๋ค. ์ ํ์์ ํ ๋๋ก ์ฝ๋๋ฅผ ๊ตฌํํ์.
์ฝ๋
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])
3. ๊ฐ๋ฏธ ์ ์ฌ
๋์ด๋ ์ค
๋ฌธ์
๋ฉ๋๊ธฐ ๋ง์์๋ ์ฌ๋ฌ ๊ฐ์ ์๋์ฐฝ๊ณ ๊ฐ ์๋๋ฐ ๊ฐ ์ฐฝ๊ณ ๋ ์ผ์ง์ ์ผ๋ก ์ด์ด์ ธ ์๋ค. ์๋์ฐฝ๊ณ ์๋ ์ ํด์ง ์์ ์๋์ ์ ์ฅํ๊ณ ์์ผ๋ฉฐ ๊ฐ๋ฏธ ์ ์ฌ๋ ์๋์ฐฝ๊ณ ๋ฅผ ์ ํ์ ์ผ๋ก ์ฝํํ์ฌ ์๋์ ๋นผ์์ ์์ ์ด๋ค. ์ด๋ ๋ฉ๋๊ธฐ ์ ์ฐฐ๋ณ๋ค์ ์ผ์ง์ ์์ ์กด์ฌํ๋ ์๋์ฐฝ๊ณ ์ค์์ ์๋ก ์ธ์ ํ ์๋์ฐฝ๊ณ ๊ฐ ๊ณต๊ฒฉ๋ฐ์ผ๋ก ๋ฐ๋ก ์์์ฑ ์ ์๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฏธ ์ ์ฌ๊ฐ ์ ์ฐฐ๋ณ์๊ฒ ๋คํค์ง ์๊ธฐ ์ํด์๋ ์ต์ํ ํ ์นธ์ด์ ๋จ์ด์ง ์ฐฝ๊ณ ๋ฅผ ์ฝํํด์ผ ํ๋ค. ์๋์ฐฝ๊ณ N๊ฐ์ ๋ํ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋ ์ป์ ์ ์๋ ์๋์ ์ต๋๊ฐ์ ๊ตฌํ์์ค.
ํด์ค
a[i] = max(a[i-1], a[i-2]+k[i])
์ ์ ํ์์ ์ฌ์ฉํ๋ค.
์ฝ๋
x = int(input())
arr = 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]+arr[i])
print(d[n-1])
4. ๋ฐ๋ฅ ๊ณต์ฌ
๋์ด๋ ์คํ
๋ฌธ์
๊ฐ๋ก์ ๊ธธ์ด๊ฐ N, ์ธ๋ก ๊ธธ์ด๊ฐ 2์ธ ์ง์ฌ๊ฐํ์ ๋ฐ๋ฅ์ด ์๋ค. ์ด ์์ ๋ฐ๋ฅ์ 1* 2 ๋ฎ๊ฐ, 2* 1 ๋ฎ๊ฐ, 2*2 ๋ฅ๊ฐ๋ฅผ ์ด์ฉํด ์ฑ์ฐ๊ณ ์ ํ๋ค. ๋ฐ๋ฅ์ ์ฑ์ฐ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ชจ๋ ๊ตฌํ์์ค.
ํด์ค
์ด ๋ฌธ์ ๋ DP ์์ ์์ ๋น ์ง ์ ์๋ ํ์ผ๋ง ๋ฌธ์ ์ ํ์ด๋ค. ์ผ์ชฝ๋ถํฐ N-2 ๋ฏธ๋ง์ ๊ธธ์ด๋ ๊ณ ๋ คํ ํ์๊ฐ ์๋ค.
a[i] = a[i-1] + a[i-2] * 2
์ฝ๋
x = 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
print(d[n])
5. ํจ์จ์ ์ธ ํํ ๊ตฌ์ฑ
๋ฌธ์
N๊ฐ์ง ์ข ๋ฅ์ ํํ๊ฐ ์๊ณ , ์ด ํํ๋ค์ ๊ฐ์๋ฅผ ์ต์ํ์ผ๋ก ์ด์ฉํ์ฌ ๊ทธ ๊ฐ์น์ ํฉ์ด M์์ด ๋๋๋ก ํ๋ ค๊ณ ํ๋ค. ์ด๋ ๊ฐ ํํ๋ ๋ช ๊ฐ๋ผ๋ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ฌ์ฉํ ํํ์ ๊ตฌ์ฑ์ ๊ฐ์ง๋ง ์์๋ง ๋ค๋ฅธ ๊ฒ์ ๊ฐ์ ๊ฒฝ์ฐ๋ก ๊ตฌ๋ถํ๋ค.
ํด์ค
๊ทธ๋ฆฌ๋๋ ๋น์ทํ์ง๋ง ํฐ ํํ๊ฐ ์์ ํํ์ ๋ฐฐ์๊ฐ ์๋๋ผ๋ ์ ์ด ๋ค๋ฅด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ DP๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
์ฝ๋
n, m = map(int(input()))
array = []
for _ in range(n) :
array.append(int(input()))
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:
print(-1)
else : print(d[m])