[BOJ][๐ก5][๋ฐฑ์ค#10835] ์นด๋๊ฒ์
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold V
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
์งํ์ด๋ ์ต๊ทผ์ ํผ์ ํ๋ ์นด๋๊ฒ์์ ์ฆ๊ฒจํ๊ณ ์๋ค. ๊ฒ์์ ์ฌ์ฉํ๋ ๊ฐ ์นด๋์๋ ์์ ์ ์ ํ๋๊ฐ ์ ํ์๊ณ ๊ฐ์ ์ซ์๊ฐ ์ ํ ์นด๋๋ ์ฌ๋ฌ ์ฅ ์์ ์ ์๋ค. ๊ฒ์๋ฐฉ๋ฒ์ ์ฐ์ ์ง์๊ฐ์ ์นด๋๋ฅผ ๋ฌด์์๋ก ์์ ๋ค ๊ฐ์ ๊ฐ์์ ๋ ๋๋ฏธ๋ก ๋๋์ด ํ๋๋ ์ผ์ชฝ์ ๋ค๋ฅธ ํ๋๋ ์ค๋ฅธ์ชฝ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋น ํต์ ํ๋ ์ค๋นํ๋ค.ย ์ด์ ๊ฐ ๋๋ฏธ์ ์ ์ผ ์์ ์๋ ์นด๋๋ผ๋ฆฌ ์๋ก ๋น๊ตํ๋ฉฐ ๊ฒ์์ ํ๋ค. ๊ฒ์ ๊ท์น์ ๋ค์๊ณผ ๊ฐ๋ค. ์ง๊ธ๋ถํฐ ์ผ์ชฝ ๋๋ฏธ์ ์ ์ผ ์ ์นด๋๋ฅผ ์ผ์ชฝ ์นด๋๋ก, ์ค๋ฅธ์ชฝ ๋๋ฏธ์ ์ ์ผ ์ ์นด๋๋ฅผ ์ค๋ฅธ์ชฝ ์นด๋๋ก ๋ถ๋ฅด๊ฒ ๋ค.
์ธ์ ๋ ์ง ์ผ์ชฝ ์นด๋๋ง ํต์ ๋ฒ๋ฆด ์๋ ์๊ณ ์ผ์ชฝ ์นด๋์ ์ค๋ฅธ์ชฝ ์นด๋๋ฅผ ๋ ๋ค ํต์ ๋ฒ๋ฆด ์๋ ์๋ค. ์ด๋ ์ป๋ ์ ์๋ ์๋ค. ์ค๋ฅธ์ชฝ ์นด๋์ ์ ํ ์๊ฐ ์ผ์ชฝ ์นด๋์ ์ ํ ์๋ณด๋ค ์์ ๊ฒฝ์ฐ์๋ ์ค๋ฅธ์ชฝ ์นด๋๋ง ํต์ ๋ฒ๋ฆด ์๋ ์๋ค. ์ค๋ฅธ์ชฝ ์นด๋๋ง ๋ฒ๋ฆฌ๋ ๊ฒฝ์ฐ์๋ ์ค๋ฅธ์ชฝ ์นด๋์ ์ ํ ์๋งํผ ์ ์๋ฅผ ์ป๋๋ค. (1)๊ณผ (2)์ ๊ท์น์ ๋ฐ๋ผ ๊ฒ์์ ์งํํ๋ค๊ฐ ์ด๋ ์ชฝ ๋๋ฏธ๋ ๋จ์ ์นด๋๊ฐ ์๋ค๋ฉด ๊ฒ์์ด ๋๋๋ฉฐ ๊ทธ๋๊น์ง ์ป์ ์ ์์ ํฉ์ด ์ต์ข ์ ์๊ฐ ๋๋ค.ย
๋ค์ ์๋ ์ธ ์ฅ ์ฉ ๋ ๋๋ฏธ์ ์นด๋๋ฅผ ๊ฐ์ง๊ณ ๊ฒ์์ ์์ํ๋ ๊ฒฝ์ฐ์ด๋ค
์นด๋ ์์ ์ผ์ชฝ ๋๋ฏธ ์ค๋ฅธ์ชฝ ๋๋ฏธ
1 3 2
2 2 4
3 5 1
์ด ๊ฒฝ์ฐ, ์ฐ์ ์ค๋ฅธ์ชฝ ์นด๋ 2๊ฐ ์ผ์ชฝ ์นด๋ 3๋ณด๋ค ์์ผ๋ฏ๋ก ๊ท์น (1)์ ๋ฐ๋ผ ์ผ์ชฝ ์นด๋๋ง ๋ฒ๋ฆฌ๊ฑฐ๋ย ์ผ์ชฝ ์นด๋์ ์ค๋ฅธ์ชฝ ์นด๋๋ฅผ ๋ชจ๋ ๋ฒ๋ฆฌ๊ฑฐ๋, ๊ท์น (2)์ ๋ฐ๋ผ ์ค๋ฅธ์ชฝ ์นด๋๋ง ๋ฒ๋ฆด ์ ์๋ค. ๋ง์ฝ ์ค๋ฅธ์ชฝ ์นด๋๋ง ๋ฒ๋ฆฌ๋ ๊ฒ์ผ๋ก ์ ํํ๋ฉด, 2๋งํผ ์ ์๋ฅผ ์ป๊ณ ์ค๋ฅธ์ชฝ ์นด๋ 2๋ ๋ฒ๋ฆฐ๋ค. ์ด์ ์ค๋ฅธ์ชฝ ๋๋ฏธ์ ์ ์ผ ์ ์นด๋๋ 4์ด๊ณ ์ด๋ ์ผ์ชฝ ์นด๋ 3๋ณด๋ค ํฌ๋ฏ๋ก ๊ท์น (1)์ ๋ฐ๋ผ ์ผ์ชฝ ์นด๋๋ง ๋ฒ๋ฆฌ๊ฑฐ๋ ์ผ์ชฝ ์นด๋์ ์ค๋ฅธ์ชฝ ์นด๋๋ฅผ ๋ ๋ค ๋ฒ๋ฆด ์ ์๋ค. ๋ง์ฝ ๋ ๋ค ๋ฒ๋ฆฌ๋ ๊ฒ์ผ๋ก ์ ํํ๋ฉด, ์ด์ ์ผ์ชฝ ์นด๋๋ 2๊ฐ ๋๊ณ ์ค๋ฅธ์ชฝ ์นด๋๋ 1์ด ๋๋ค. ์ด ๊ฒฝ์ฐ ๋ค์ ๊ท์น (1)๊ณผ (2)์ ๋ฐ๋ผ ์ธ ๊ฐ์ง ์ค ํ๊ฐ์ง๋ฅผ ์ ํํ ์ ์๊ณ , ๊ทธ ์ค ์ผ์ชฝ ์นด๋๋ง ๋ฒ๋ฆฌ๋ ๊ฒ์ผ๋ก ์ ํํ๋ฉด ์ด์ ์ผ์ชฝ ์นด๋๋ 5๊ฐ ๋๊ณ ์ค๋ฅธ์ชฝ ์นด๋๋ 1์ด ๋๋ค. ์ด ๊ฒฝ์ฐ์๋ ์ญ์ ๊ท์น (1)๊ณผ (2)์ ๋ฐ๋ผ ์ธ ๊ฐ์ง ์ค ํ๊ฐ์ง๋ฅผ ์ ํํ ์ ์๊ณ , ๊ทธ ์ค ์ค๋ฅธ์ชฝ ์นด๋๋ง ๋ฒ๋ฆฌ๋ ๊ฒ์ผ๋ก ์ ํํ๋ฉด 1๋งํผ ์ ์๋ฅผ ์ป๊ณ ์ค๋ฅธ์ชฝ ์นด๋ 1์ ๋ฒ๋ฆฐ๋ค. ์ด์ ์ค๋ฅธ์ชฝ ๋๋ฏธ์๋ ๋จ์ ์นด๋๊ฐ ์์ผ๋ฏ๋ก ๊ท์น (3)์ ๋ฐ๋ผ ๊ฒ์์ด ๋๋๋ฉฐ ์ต์ข ์ ์๋ 2+1=3์ด ๋๋ค. ๋ ๋๋ฏธ์ ์นด๋๊ฐ ์ฃผ์ด์ก์ ๋, ๊ฒ์์ ํตํด ์ป์ ์ ์๋ ์ต์ข ์ ์์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ์ ์์์ ์ต์ข ์ ์์ ์ต๋๊ฐ์ 7์ด๋ค.
์ ๋ ฅ
์ฒซ ์ค์๋ ํ ๋๋ฏธ์ ์นด๋์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ์์ฐ์ N(1 โค N โค 2,000)์ด ์ฃผ์ด์ง๋ค. ๋ค์ ์ค์๋ ์ผ์ชฝ ๋๋ฏธ์ ์นด๋์ ์ ํ ์ ์ A(1 โค A โค 2,000)๊ฐ ์นด๋ ์์๋๋ก N๊ฐ ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ ์ค์๋ ์ค๋ฅธ์ชฝ ๋๋ฏธ์ ์นด๋์ ์ ํ ์ ์ B(1 โค B โค 2,000)๊ฐ ์นด๋ ์์๋๋ก N๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ๋๋ฏธ์๋ ๊ฐ์ ์ซ์๋ฅผ ๊ฐ์ง ์นด๋๊ฐ ๋ ๊ฐ ์ด์ ์์ ์ ์๋ค.
์ถ๋ ฅ
์ป์ ์ ์๋ ์ต์ข ์ ์์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
์์
์์ 1
์ ๋ ฅ
3
3 2 5
2 4 1
์ถ๋ ฅ
7
์์ 2
์ ๋ ฅ
4
1 2 3 4
4 1 2 3
์ถ๋ ฅ
6
My Sol A: ์ ์์ผ๋ก ํ๊ธฐ(์คํจ)
import sys
input = sys.stdin.readline
N = int(input())
Ls = [0] + list(map(int, input().split()))
Rs = [0] + list(map(int, input().split()))
dp = [[0]*(N+1) for _ in range(N+1)]
for l in range(1, N+1):
for r in range(1, N+1):
if Rs[r] < Ls[l]:
dp[l][r] = max(dp[l-1][r-1], dp[l-1][r], dp[l][r-1]+Rs[r])
else:
dp[l][r] = max(dp[l-1][r-1], dp[l-1][r])
print(dp[N][N])
DP๋ฅผ ์ฌ์ฉํ๋ ๋ฌธ์ ๊ฐ์๋ค. ์์๋ถํฐ ์นด๋์ ์์๋ฅผ ๊ฐ๊ฐ l๊ณผ r์ด๋ผ๊ณ ํ ๋ ์ด๋ฅผ ๊ฐ๊ฐ ํ์ด๋ก ๋ฐ์ ธ 2์ฐจ์ ๋ฐฐ์ด๋ก ๊ฐ์ ๊ตฌํ๋ ๋ฐฉ์์ด์๋ค.
๋ถ๋ช ํ ํ ์คํธ์ผ์ด์ค๋ ๊ทธ๋ ๊ณ , ๋ ผ๋ฆฌ์ ์ผ๋ก๋ ํ๋ฆด ๊ฒ ์์ ๊ฒ ๊ฐ์๋๋ฐ, ๊ณ์ ํ๋ ธ๋ค๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์๋ค.
๋์ ํ ํ๋ฆฌ์ง ์์ ๋ง์ ๋ธ๋ก๊ทธ๋ค์ ์ฐธ๊ณ ํด๋ณด์๋๋ฐ, ๋ชจ๋ ๋ฌธ์ ๋ฅผ ์ญ์์ผ๋ก ์ ๊ทผํด์ ํ์๋ค.
My Sol B: ์ญ์์ผ๋ก ํ๊ธฐ
import sys
input = sys.stdin.readline
N = int(input())
Ls = list(map(int, input().split()))
Rs = list(map(int, input().split()))
dp = [[0]*(N+1) for _ in range(N+1)]
for l in range(N-1, -1, -1):
for r in range(N-1, -1, -1):
if Rs[r] < Ls[l]:
dp[l][r] = max(dp[l+1][r+1], dp[l+1][r], dp[l][r+1]+Rs[r])
else:
dp[l][r] = max(dp[l+1][r+1], dp[l+1][r])
print(dp[0][0])
๋ ์ญ์ ๋ฐฉ์์ ๋ฐ๊พธ์ด ์ญ์์ผ๋ก๋ง ์ ๊ทผํด ํ์๋๋ฐ ๋ฐ๋ก ํฉ๊ฒฉ์ด์๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
import sys
sys.setrecursionlimit(10**7)
input = sys.stdin.readline
n = int(input())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
def dfs(cache, left, right, n):
if left >= n or right >= n:
return 0
if cache[left][right] != -1:
return cache[left][right]
if a[left] > b[right]:
cache[left][right] = dfs(cache, left, right+1, n) + b[right]
else:
throw_both = dfs(cache, left+1, right, n)
throw_left = dfs(cache, left+1, right+1, n)
cache[left][right] = max(throw_both, throw_left)
return cache[left][right]
def solution():
cache = [[-1]*n for _ in range(n)]
dfs(cache, 0, 0, n)
print(cache[0][0])
solution()
๋ด ํ์ด๋ณด๋ค ์ ๋ฐ์ ๊ฐ๊น๊ฒ ์ฐ์ฐ์๋๊ฐ ๋น ๋ฅธ ํ์ด๋ฅผ ๊ฐ์ ธ์ ๋ถ์ํด๋ณด๋ ค ํ๋ค.
๋ด๊ฐ ์ด ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฅ 2์ฐจ์ ๋ฐฐ์ด dp๋ฅผ cache๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์ํ์๊ณ , -1์ ๊ฐ์ ๋ด์ ์ด๊ธฐํํ๋ค. global๋ก cache๋ฅผ ํจ์ ๋ด์ ๋ฃ์ง ์๊ณ , ์ธ์๋ก ๋ฃ์๊ณ , ๋๊ฐ์ด ์ญ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํ์ด cache[0][0]๋ฅผ ์ถ๋ ฅํ๋ ๋ฐฉ์์ด์๋ค.
ํน์ดํ ์ ์ dfs๋ฅผ ์ด์ฉํด cache๋ฅผ ์ฑ์ฐ๋ ๋ฐฉ์์ธ๋ฐ, for๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฑฐ์ ๊ฐ์๋ฐ๋ dfs๋ฅผ ์ฌ์ฉํ๋ ์ ์ด ์ธ์ ๊น์๋ค. ์ํํ๋ค๊ณ ์๊ฐ๋๋ ๋ถ๋ถ์ a[left] > b[right]์ธ ๊ฒฝ์ฐ cache๋ฅผ max๋ก ๋ฐ์ง์ง ์๊ณ dfs ํจ์์ ๋ฐ๋ก b[right]๋ฅผ ๋ํด๋ฒ๋ฆฌ๋ ๋ฐฉ์์ธ๋ฐ, ์ด๊ฒ์ด ์ฐ์ฐ ์๊ฐ์ ์ฐจ์ด๋ฅผ ์ผ๊ธฐํ๋ ๊ฐ์ฅ ํฐ ์์ธ์ธ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ฐ๋ฐ ์ด๊ฒ์ด ์ด๋ป๊ฒ ๊ฐ๋ฅํ ๊น? ๋น๊ตํด์ผํ๋ ๋ค๋ฅธ ์์๋ค์ ๋ฌด์ํด๋ ๋๋ ๊ฒ์ผ๊น? ๊ณ ๋ คํ ํ์๊ฐ ์์์๊น? ์๋ฌธ์ด ๋ค์๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ