[DP] ๋ฐฑ์ค 11058 ํฌ๋ฆฌ๋ณด๋ python
๐ ๋ฐฑ์ค 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