๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ช๐Ÿป์ฝ”๋”ฉํ…Œ์ŠคํŠธ/๋ฐฑ์ค€ & ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[DP] ๋ฐฑ์ค€ 11058 ํฌ๋ฆฌ๋ณด๋“œ python

๐Ÿ“„ ๋ฐฑ์ค€ 11058 ํฌ๋ฆฌ๋ณด๋“œ  ๐Ÿ“„

www.acmicpc.net/problem/11058

 

11058๋ฒˆ: ํฌ๋ฆฌ๋ณด๋“œ

N = 3์ธ ๊ฒฝ์šฐ์— A, A, A๋ฅผ ๋ˆŒ๋Ÿฌ A 3๊ฐœ๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค. N = 7์ธ ๊ฒฝ์šฐ์—๋Š” A, A, A, Ctrl-A, Ctrl-C, Ctrl-V, Ctrl-V๋ฅผ ๋ˆŒ๋Ÿฌ 9๊ฐœ๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค. N = 11์ธ ๊ฒฝ์šฐ์—๋Š” A, A, A, Ctrl-A, Ctrl-C, Ctrl-V, Ctrl-V, Ctrl-A, Ctrl-C, Ctrl

www.acmicpc.net


๐Ÿค” ๋ฌธ์ œ ํ’€์ด  ๐Ÿค”

๋ฒ„ํŠผ 1์„ ๋ˆ„๋ฅด๋Š” ๊ฒฝ์šฐ dp[n] = dp[n - 1] + 1

๋ฒ„ํŠผ 2, 3์„ ๋ˆ„๋ฅด๋Š” ๊ฒฝ์šฐ๋Š” ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ตœ๋Œ“๊ฐ’์ด ๋  ์ˆ˜ ์—†๋‹ค.

๋ฒ„ํŠผ 4๋ฅผ ๋ˆ„๋ฅด๋Š” ๊ฒฝ์šฐ๋Š” ctrl + A, ctrl + C์ธ 2, 3๋ฒˆ ๋ฒ„ํŠผ์ด ์„ ํ–‰๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ์ด 3๊ฐœ์˜ ๋ฒ„ํŠผ ์ž…๋ ฅ์ด ํ•„์š”ํ•˜๋‹ค. (dp[n] = dp[n - 3] * 2)

์ด ๋•Œ ๋ฒ„ํŠผ 4๋ฅผ ์—ฐ์†ํ•ด์„œ ๋‘๋ฒˆ ๋ˆ„๋ฅด๋ฉด 3๋ฐฐ๊ฐ€ ๋˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์œผ๋ฏ€๋กœ dp[n] = dp[n - 4] * 3

์ด๋Ÿฐ ์‹์œผ๋กœ ๋ฒ„ํŠผ 4๋ฅผ ์—ฐ์†ํ•ด์„œ ๋ˆ„๋ฅด๋Š” ์‹์„ ๊ตฌํ•˜๊ฒŒ ๋˜๋ฉด dp[n] = dp[n - j] * (j - 1) ์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

 

n์ด 1 ~ 6๊นŒ์ง€๋Š” ๊ทธ๋ƒฅ ๋ฒ„ํŠผ 1๋งŒ ๋ˆŒ๋Ÿฌ๋„ ์ตœ๋Œ“๊ฐ’์ด ๋‚˜์˜จ๋‹ค. dp[1 ~ 6] = 1 ~ 6

7๋ถ€ํ„ฐ๋Š” ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ์ ์šฉํ•ด์ค€๋‹ค. dp[i] = max(dp[i], dp[i - j] * (j - 1)) (๋‹จ, i - j > 0)

 

7์ดํ›„๋ถ€ํ„ฐ๋Š” n์—์„œ ๋ฒ„ํผ์— ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ํฌ๊ธฐ๊ฐ€ 1๋ณด๋‹ค๋Š” ํฌ๋ฏ€๋กœ dp[n] = dp[n - 1] + 1์€ ์ตœ๋Œ“๊ฐ’์ด ๋ ์ˆ˜ ์—†๋‹ค. ์ด๊ฑธ๋กœ ๋ฒ„ํŠผ 1๊ฐœ๋ฅผ ์†Œ๋ชจํ•  ๋ฐ”์—” ๊ทธ๋ƒฅ ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•œ๋ฒˆ ๋” ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ํฌ๊ธฐ๋ฅผ ๋” ๋Š˜๋ฆด ์ˆ˜ ์žˆ๋‹ค.

 


โŒจ๏ธ ์ฝ”๋“œ โŒจ๏ธ

n = int(input())

dp = [0] * (n + 1)

if n <= 6:
    print(n)
    exit(0)

for i in range(1, 7):
    dp[i] = i

for i in range(7, n + 1):
    for j in range(3, n + 1):
        if i - j < 0:
            break
        dp[i] = max((j - 1) * dp[i - j], dp[i])

print(dp[n])

Reference