[BOJ][๐ŸŸก5][๋ฐฑ์ค€#10835] ์นด๋“œ๊ฒŒ์ž„

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #10835


๋ฌธ์ œ

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

์–ธ์ œ๋“ ์ง€ ์™ผ์ชฝ ์นด๋“œ๋งŒ ํ†ต์— ๋ฒ„๋ฆด ์ˆ˜๋„ ์žˆ๊ณ  ์™ผ์ชฝ ์นด๋“œ์™€ ์˜ค๋ฅธ์ชฝ ์นด๋“œ๋ฅผ ๋‘˜ ๋‹ค ํ†ต์— ๋ฒ„๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋•Œ ์–ป๋Š” ์ ์ˆ˜๋Š” ์—†๋‹ค. ์˜ค๋ฅธ์ชฝ ์นด๋“œ์— ์ ํžŒ ์ˆ˜๊ฐ€ ์™ผ์ชฝ ์นด๋“œ์— ์ ํžŒ ์ˆ˜๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ์—๋Š” ์˜ค๋ฅธ์ชฝ ์นด๋“œ๋งŒ ํ†ต์— ๋ฒ„๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ค๋ฅธ์ชฝ ์นด๋“œ๋งŒ ๋ฒ„๋ฆฌ๋Š” ๊ฒฝ์šฐ์—๋Š” ์˜ค๋ฅธ์ชฝ ์นด๋“œ์— ์ ํžŒ ์ˆ˜๋งŒํผ ์ ์ˆ˜๋ฅผ ์–ป๋Š”๋‹ค. (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]๋ฅผ ๋”ํ•ด๋ฒ„๋ฆฌ๋Š” ๋ฐฉ์‹์ธ๋ฐ, ์ด๊ฒƒ์ด ์—ฐ์‚ฐ ์‹œ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ์•ผ๊ธฐํ•˜๋Š” ๊ฐ€์žฅ ํฐ ์š”์ธ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ• ๊นŒ? ๋น„๊ตํ•ด์•ผํ•˜๋Š” ๋‹ค๋ฅธ ์š”์†Œ๋“ค์€ ๋ฌด์‹œํ•ด๋„ ๋˜๋Š” ๊ฒƒ์ผ๊นŒ? ๊ณ ๋ คํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ์„๊นŒ? ์˜๋ฌธ์ด ๋“ค์—ˆ๋‹ค.

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ