DFS๋ก ํ์๋ค๊ฐ ์คํจํ๊ณ DP๋ก ์ฑ๊ณต
์ค๋ฒ 3 ์ ๋์๋
๐ผ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/2579
- ํฐ์ด: ์ค๋ฒ III
- ๋ถ๋ฅ: ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
โ TRIAL 1.
์ฝ๋
import sys
input = sys.stdin.readline
def dfs(stairs, val, ctr):
if not stairs:
return val
next_val = stairs.pop()
if ctr != 2:
dfs1 = dfs(stairs, val+next_val, ctr+1)
dfs0 = dfs(stairs, val, 0)
stairs.append(next_val)
return max(dfs1, dfs0)
else:
dfs0 = dfs(stairs, val, 0)
stairs.append(next_val)
return dfs0
N = int(input())
stairs = []
for _ in range(N):
stairs.append(int(input()))
val = stairs.pop()
print(dfs(stairs, val, 1))
์ฝ๋ ์ค๋ช
- ์ฐ์์ผ๋ก ๋ช๊ฐ์ ๊ณ๋จ์ ๋ฐ์๋์ง๋ฅผ ์ธ๋ ctr์ dfs์ ํจ๊ป ์ ๋ฌํจ
- ๋ง์ฝ ctr์ด 2์ด๋ฉด, ๋ค์ ๊ณ๋จ์ ๋ฐ์ง ์์. ctr์ 0์ผ๋ก ์ด๊ธฐํ
- ctr์ด 2๊ฐ ์๋๋ฉด, ๋ค์ ๊ณ๋จ์ ๋ฐ๋ ๊ฒฝ์ฐ์ ๋ฐ์ง ์๋ ๊ฒฝ์ฐ ์ค ํฐ ๊ฐ์ ์ด์ฉ. ๋ค์ ๊ณ๋จ์ ๋ฐ๋ ๊ฒฝ์ฐ ctr์ 1 ์ถ๊ฐ
ํ๋ฆฐ ์์ธ
์๊ฐ์ด๊ณผ. DFS๋ก ํ๋ฉด ๊ฑฐ์ binary tree์ ๋น์ทํ๊ธฐ ๋๋ฌธ์ O(N^2) ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค. (๊ตฌํ์ ์ ์ผ ๊ฐ๋จ)
โ TRIAL 2.
์ฝ๋
import sys
input = sys.stdin.readline
N = int(input())
stairs = []
for _ in range(N):
stairs.append(int(input()))
d0 = [0] * N
d1 = [0] * N
dmax = [0] * N
d0[0], d1[0] = stairs[0], stairs[0]
d0[1], d1[1] = stairs[1], stairs[0]+stairs[1]
dmax[0] = max(d0[0], d1[0])
dmax[1] = max(d0[1], d1[1])
for i in range(2, N):
d0[i] = dmax[i-2] + stairs[i]
d1[i] = d0[i-1] + stairs[i]
dmax[i] = max(d0[i], d1[i])
print(dmax[N-1])
์์ ํ ๋ถ๋ถ
- DFS bottom-up ๋ฐฉ์์ผ๋ก ์์
- ์ด์ ๊ณ๋จ์ ๋ฐ์ ๊ฒฝ์ฐ์ธ d0, ์ด์ ๊ณ๋จ์ ๋ฐ์ง ์์ ๊ฒฝ์ฐ์ธ d1, ๋ ๊ฒฝ์ฐ์ ์ต๋๊ฐ์ธ dmax ์ธ ๊ฐ์ array๋ฅผ ๊ณ์ฐํจ
- d0์ ๊ณ์ฐํ ๋๋ ๋์นธ ์ ์ dmax๊ฐ์ ํ์ฌ ๊ณ๋จ ๊ฐ์ ๋ํจ
- d1์ ๊ณ์ฐํ ๋๋ ํ์นธ ์ ์ d0๊ฐ์ ํ์ฌ ๊ณ๋จ ๊ฐ์ ๋ํจ
- d0๊ณผ d1์ ๊ณ์ฐํ ํ dmax ๊ฐ์ ๊ณ์ฐ
ํ๋ฆฐ ์์ธ
Runtime error. ๊ณ๋จ์ด ํ๋์ธ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ ค ๋ชปํจ
๐ก Solution
์ฝ๋
import sys
input = sys.stdin.readline
N = int(input())
stairs = [0]
for _ in range(N):
stairs.append(int(input()))
d0 = [0] * (N+1)
d1 = [0] * (N+1)
dmax = [0] * (N+1)
d0[1], d1[1] = stairs[1], stairs[1]
dmax[1] = max(d0[1], d1[1])
for i in range(2, N+1):
d0[i] = dmax[i-2] + stairs[i]
d1[i] = d0[i-1] + stairs[i]
dmax[i] = max(d0[i], d1[i])
print(dmax[N])
์ฝ๋ ์ค๋ช
- DFS bottom-up
- ์ด์ ๊ณ๋จ์ ๋ฐ์ ๊ฒฝ์ฐ์ธ d0, ์ด์ ๊ณ๋จ์ ๋ฐ์ง ์์ ๊ฒฝ์ฐ์ธ d1, ๋ ๊ฒฝ์ฐ์ ์ต๋๊ฐ์ธ dmax ์ธ ๊ฐ์ array๋ฅผ ๊ณ์ฐํจ
- d0์ ๊ณ์ฐํ ๋๋ ๋์นธ ์ ์ dmax๊ฐ์ ํ์ฌ ๊ณ๋จ ๊ฐ์ ๋ํจ
- d1์ ๊ณ์ฐํ ๋๋ ํ์นธ ์ ์ d0๊ฐ์ ํ์ฌ ๊ณ๋จ ๊ฐ์ ๋ํจ
- d0๊ณผ d1์ ๊ณ์ฐํ ํ dmax ๊ฐ์ ๊ณ์ฐ
- ์์์์น๋ฅผ 0์ผ๋ก ์ก์