[Python - ๋ฐฑ์ค€ 14501] ํ‡ด์‚ฌ

2021. 4. 14. 14:19ใ†๐Ÿ“š Algorithm/๐Ÿ’ช๐Ÿป Python ๋ฌธ์ œ ํ’€์ด

๋ฐ˜์‘ํ˜•
 

14501๋ฒˆ: ํ‡ด์‚ฌ

์ฒซ์งธ ์ค„์— ๋ฐฑ์ค€์ด๊ฐ€ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ด์ต์„ ์ถœ๋ ฅํ•œ๋‹ค.

www.acmicpc.net

๋ฌธ์ œ ์„ค๋ช…

์ƒ๋‹ด์›์œผ๋กœ ์ผํ•˜๊ณ  ์žˆ๋Š” ๋ฐฑ์ค€์ด๋Š” ํ‡ด์‚ฌ๋ฅผ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

์˜ค๋Š˜๋ถ€ํ„ฐ N+1์ผ์งธ ๋˜๋Š” ๋‚  ํ‡ด์‚ฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ, ๋‚จ์€ N์ผ ๋™์•ˆ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ์ƒ๋‹ด์„ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

๋ฐฑ์ค€์ด๋Š” ๋น„์„œ์—๊ฒŒ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ์ƒ๋‹ด์„ ์žก์œผ๋ผ๊ณ  ๋ถ€ํƒ์„ ํ–ˆ๊ณ , ๋น„์„œ๋Š” ํ•˜๋ฃจ์— ํ•˜๋‚˜์”ฉ ์„œ๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ƒ๋‹ด์„ ์žก์•„๋†“์•˜๋‹ค.

๊ฐ๊ฐ์˜ ์ƒ๋‹ด์€ ์ƒ๋‹ด์„ ์™„๋ฃŒํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ๊ธฐ๊ฐ„ Ti์™€ ์ƒ๋‹ด์„ ํ–ˆ์„ ๋•Œ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ธˆ์•ก Pi๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

N = 7์ธ ๊ฒฝ์šฐ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒ๋‹ด ์ผ์ •ํ‘œ๋ฅผ ๋ณด์ž.

 1์ผ2์ผ3์ผ4์ผ5์ผ6์ผ7์ผTiPi

3 5 1 1 2 4 2
10 20 10 20 15 40 200

1์ผ์— ์žกํ˜€์žˆ๋Š” ์ƒ๋‹ด์€ ์ด 3์ผ์ด ๊ฑธ๋ฆฌ๋ฉฐ, ์ƒ๋‹ดํ–ˆ์„ ๋•Œ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ธˆ์•ก์€ 10์ด๋‹ค. 5์ผ์— ์žกํ˜€์žˆ๋Š” ์ƒ๋‹ด์€ ์ด 2์ผ์ด ๊ฑธ๋ฆฌ๋ฉฐ, ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ธˆ์•ก์€ 15์ด๋‹ค.

์ƒ๋‹ด์„ ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๊ธฐ๊ฐ„์€ 1์ผ๋ณด๋‹ค ํด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋“  ์ƒ๋‹ด์„ ํ•  ์ˆ˜๋Š” ์—†๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ 1์ผ์— ์ƒ๋‹ด์„ ํ•˜๊ฒŒ ๋˜๋ฉด, 2์ผ, 3์ผ์— ์žˆ๋Š” ์ƒ๋‹ด์€ ํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค. 2์ผ์— ์žˆ๋Š” ์ƒ๋‹ด์„ ํ•˜๊ฒŒ ๋˜๋ฉด, 3, 4, 5, 6์ผ์— ์žกํ˜€์žˆ๋Š” ์ƒ๋‹ด์€ ํ•  ์ˆ˜ ์—†๋‹ค.

๋˜ํ•œ, N+1์ผ์งธ์—๋Š” ํšŒ์‚ฌ์— ์—†๊ธฐ ๋•Œ๋ฌธ์—, 6, 7์ผ์— ์žˆ๋Š” ์ƒ๋‹ด์„ ํ•  ์ˆ˜ ์—†๋‹ค.

ํ‡ด์‚ฌ ์ „์— ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ๋‹ด์˜ ์ตœ๋Œ€ ์ด์ต์€ 1์ผ, 4์ผ, 5์ผ์— ์žˆ๋Š” ์ƒ๋‹ด์„ ํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ, ์ด๋•Œ์˜ ์ด์ต์€ 10+20+15=45์ด๋‹ค.

์ƒ๋‹ด์„ ์ ์ ˆํžˆ ํ–ˆ์„ ๋•Œ, ๋ฐฑ์ค€์ด๊ฐ€ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ˆ˜์ต์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅํ˜•์‹

์ฒซ์งธ ์ค„์— N (1 ≤ N ≤ 15)์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— Ti์™€ Pi๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด์„œ ์ฃผ์–ด์ง€๋ฉฐ, 1์ผ๋ถ€ํ„ฐ N์ผ๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ Ti ≤ 5, 1 ≤ Pi ≤ 1,000)

 

์ถœ๋ ฅํ˜•์‹

์ฒซ์งธ ์ค„์— ๋ฐฑ์ค€์ด๊ฐ€ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ด์ต์„ ์ถœ๋ ฅํ•œ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

ํ’€์ด ๊ณผ์ •

๋ฐฑํŠธ๋ ˆํ‚น์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€๋‹ค. ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ• ๋•Œ ๊ทธ day๋ฅผ ๊ณ ๋ฅด๊ฑฐ๋‚˜ ์•ˆ๊ณ ๋ฅด๊ฑฐ๋‚˜ ๋‘๊ฐœ์˜ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋‘๊ฐ€์ง€์˜ ๊ฒฝ์šฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œ์ผœ์ฃผ์—ˆ๊ณ , ๊ธฐ์กด๋‚ ์งœ + day ๊ฐ€ n+1 ๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ, ๊ฐ™์€ ๊ฒฝ์šฐ๋กœ ์กฐ๊ฑด์„ ๋‚˜๋ˆ  return ํ•ด์ฃผ์—ˆ๋‹ค.


def dfs(day, sum):
    if day == n+1:
        global max_value
        max_value = max(max_value, sum)
        return
    if day > n+1:
        return
    dfs(day+1,sum) # ์„ ํƒ ์•ˆํ•˜๊ณ 
    dfs(day+days[day], sum+pays[day]) # ์„ ํƒ ํ•˜๊ณ 



if __name__ == '__main__':
    n = int(input())
    max_value = 0
    days = [0] * (n+1)
    pays = [0] * (n+1)
    check = [False] * n
    for i in range(1,n+1):
        days[i], pays[i] = map(int,input().split())

    dfs(1,0)
    print(max_value)

 

 

 

๋ฐ˜์‘ํ˜•