https://www.acmicpc.net/problem/17626
17626๋ฒ: Four Squares
๋ผ๊ทธ๋์ฃผ๋ 1770๋ ์ ๋ชจ๋ ์์ฐ์๋ ๋ท ํน์ ๊ทธ ์ดํ์ ์ ๊ณฑ์์ ํฉ์ผ๋ก ํํํ ์ ์๋ค๊ณ ์ฆ๋ช ํ์๋ค. ์ด๋ค ์์ฐ์๋ ๋ณต์์ ๋ฐฉ๋ฒ์ผ๋ก ํํ๋๋ค. ์๋ฅผ ๋ค๋ฉด, 26์ 52๊ณผ 12์ ํฉ์ด๋ค; ๋ํ 42 + 32 + 1
www.acmicpc.net
์์ด๋์ด
1. ๊ทธ๋ฆฌ๋์ dp
- ์ฒ์์๋ n์ ๋์ง ์๋ ์ต๋ ์ ๊ณฑ์๋ฅผ n์ ๋นผ๊ฐ๋ฉด ๋์ง ์์๊น ์๊ฐํ๋ค.
- ์ด๋ ๊ฒ ํ๋ฉด ์์ธ๊ฐ ์๊ธด๋ค. ์๋ฅผ ๋ค์ด 12๋ ๊ทธ๋ฆฌ๋๋ก ์๊ฐํ๋ฉด 9, 1, 1, 1์ด์ง๋ง ์ ๋ต์ 4,4,4๋ก 3๊ฐ๊ฐ ์ต์ ๊ฐ์๋ค.
- ๋ค์ ๋ฌธ์ ๋ด์ฉ์ ๋ณด๊ณ dp๋ก ํ๊ธฐ๋ก ๊ฒฐ์
- DP[n] = (n์ด๋ผ๋ ์๋ฅผ ๋ง๋๋๋ฐ ํ์ํ ์์ ๊ฐ์)
์ฝ๋ ์ค๋ช
k = 1
while k**2 <= n:
DP[k**2] = 1
k += 1
๋จผ์ DP๋ฆฌ์คํธ์ ์ ๊ณฑ์๋ค์ ์ ์ฅํด์ค๋ค. 1, 4, 9... ๋ ์ ๊ณฑ์์ด๋ฏ๋ก ๋ฌด์กฐ๊ฑด ์ต์ ๊ฐ์๋ 1์ด๋ค.
for i in range(1, n + 1):
if DP[i] != 0:
continue
j = 1
while j*j <= i:
if DP[i] == 0:
DP[i] = DP[j*j] + DP[i - j*j]
else:
DP[i] = min(DP[i], DP[j*j] + DP[i - j*j])
j += 1
n๊น์ง for๋ฌธ์ ์คํํ๋ค. DP์ ์ด๋ฏธ ๊ฐ์ด ์กด์ฌํ๋ฉด(= ์ ๊ณฑ์ ๋ผ๋ฉด) continue ํด์ค๋ค.
DP์ ๊ฐ์ด ์๋ค๋ฉด i๋ฅผ ๋์ง ์๋ ์ ๊ณฑ์๊น์ง ๋ฐ๋ณตํด์ฃผ๋ฉด ๋๋ค.
์๋ฅผ ๋ค์ด i๊ฐ 12๋ผ๋ฉด
DP[12] = DP[1] + DP[11]๋ฅผ ๋จผ์ ์ ์ฅํด์ค๋ค.
์ดํ์๋
DP[4] + DP[8], DP[9] + DP[3]๊ณผ ๋น๊ตํด์ ์ต์๊ฐ์ ์ ์ฅํด์ค๋ค.
์ฌ๊ธฐ์ ์ ๊ณฑ์๋ค์ ์ ๋ถ 1์ด๋ฏ๋ก DP[i] = min(DP[i - j * j]) + 1 (j*j <= i)๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์ ์ฒด ์ฝ๋
n = int(input())
count = 0
DP = [0] * (n + 1)
k = 1
while k**2 <= n:
DP[k**2] = 1
k += 1
for i in range(1, n + 1):
if DP[i] != 0:
continue
j = 1
while j*j <= i:
if DP[i] == 0:
DP[i] = DP[j*j] + DP[i - j*j]
else:
DP[i] = min(DP[i], DP[j*j] + DP[i - j*j])
j += 1
print(DP[n])
'๐งฉ Problem Solving > [๋ฐฑ์ค]' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 11403 ๊ฒฝ๋ก์ฐพ๊ธฐ (python ํ์ด์ฌ) (0) | 2022.07.06 |
---|---|
[๋ฐฑ์ค] 16236 ์๊ธฐ ์์ด (python ํ์ด์ฌ) (0) | 2022.07.05 |
[๋ฐฑ์ค] 2293 ๋์ 1 (python ํ์ด์ฌ) (1) | 2022.07.05 |
[๋ฐฑ์ค] 2096 ๋ด๋ ค๊ฐ๊ธฐ (python ํ์ด์ฌ) (0) | 2022.07.04 |
[๋ฐฑ์ค] 16928 ๋ฑ๊ณผ ์ฌ๋ค๋ฆฌ ๊ฒ์ (python ํ์ด์ฌ) (0) | 2022.07.03 |