ํฐ์คํ ๋ฆฌ ๋ทฐ
๋ฌธ์
5557๋ฒ: 1ํ๋
์๊ทผ์ด๊ฐ 1ํ๋ ๋, ๋ง์ , ๋บ์ ์ ๋งค์ฐ ์ข์ํ๋ค. ์๊ทผ์ด๋ ์ซ์๊ฐ ์ค ์ง์ด์๋ ๊ฒ์ ๋ณด๊ธฐ๋ง ํ๋ฉด, ๋ง์ง๋ง ๋ ์ซ์ ์ฌ์ด์ '='์ ๋ฃ๊ณ , ๋๋จธ์ง ์ซ์ ์ฌ์ด์๋ '+' ๋๋ '-'๋ฅผ ๋ฃ์ด ๋ฑ์์ ๋ง๋ค๋ฉฐ ๋๏ฟฝ๏ฟฝ
www.acmicpc.net
๋ฌธ์ ํ์ด
์ซ์๊ฐ ์ฃผ์ด ์ง ๋, +, - ๋ฅผ ํตํด ์ซ์๋ฅผ ๊ณ์ฐ ํ ์ ์์ผ๋ฉฐ ๊ณ์ฐ๋ ์ซ์์ ๋ฒ์๋ 0 ๋ณด๋ค ํฌ๊ณ , 20 ๋ณด๋ค ์์์ผ ํ๋ค. ๋ํ ์ฃผ์ด์ง ์ซ์๋ฅผ ๊ณ์ฐํ ๋, ๋ง์ง๋ง์ผ๋ก ์ฃผ์ด์ง ์ซ์์ ์ผ์นํด์ผ ํ๋ค. ์์ ์ ๋ ฅ1์ ๊ฒฝ์ฐ ๋ฌธ์ ์ ์ฃผ์ด์ง ํํธ์ ๊ฐ์ด ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์๊ฐ ์๋ค.
- 8+3-2-4+8-7-2-4-0+8=8
- 8+3-2-4+8-7-2-4+0+8=8
- 8+3+2+4-8-7+2-4-0+8=8
- 8+3+2+4-8-7+2-4+0+8=8
- 8+3+2-4+8-7+2+4-0-8=8
- 8+3+2-4+8-7+2+4+0-8=8
- 8-3+2+4-8+7+2+4-0-8=8
- 8-3+2+4-8+7+2+4+0-8=8
- 8-3+2-4+8+7+2-4-0-8=8
- 8-3+2-4+8+7+2-4+0-8=8
์ด ๊ฒฝ์ฐ์ ์๋ DFS๋ฅผ ํตํด ๊ตฌํ ์๋ ์์ง๋ง, 2์ฐจ์ ๋ฐฐ์ด์ ์ด์ฉํ์ฌ DP๋ก ํ์๋ ์๋ค. ์ด์ ๊ฐ์ ๋ฌธ์ ๋ ์ด์ ์ ๋ค๋ฃฌ
๊ธฐํ๋ฆฌ์คํธ์ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ํ๋ฉด ๋๋ค. ๋ค๋ง ๋ค๋ฅธ ์ ์ด ์๋ค๋ฉด ์์ ์ ๋ ฅ 1์ ๊ฒฝ์ฐ 8์ด๋ผ๋ ๊ฐ์ด ๋์ค๋ ํ์๋ฅผ ์ถ๋ ฅํด์ผ ํ๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ์ซ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ์ฐํ์์ ๋, 8์ด ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ช ๊ฐ์ธ์ง ์ค์ฒฉํ๋ฉด์ ์ฒดํฌํด์ผ ํ๋ค.
'''
7
8 3 2 4 8 7 2
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0]
[0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0]
[0, 0, 1, 0, 1, 0, 1, 0, 2, 0, 2, 0, 2, 0, 0, 0, 1, 0, 1, 0, 1]
'''
์๋ฅผ ๋ค์ด ์์ ๊ฐ์ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์คํํ๋ค๋ฉด, 2์ฐจ์ ๋ฐฐ์ด์ ๋ํ๋ผ ์ ์๋ ์ซ์๋ค์ด ํ์๋ ๊ฒ์ด๊ณ , 2๊ฐ ๋๋ ๊ฒฝ์ฐ์ ์๋ 1๊ฐ๋ผ๋ ๊ฒ์ ์ ์ ์๋ค. ๋ง์ฝ 8, 10, 12๊ฐ ๋๋ค๋ฉด 2๊ฐ์ง์ ๊ฒฝ์ฐ์ ์ ๊ฐ ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ์ด์ ๊ฐ์ด ํธ๋ฆฌ์ ๊ฐ์ ๊ตฌ์กฐ๋ก ํ์์ด ๋๋ค๋ฉด DFS๋ฅผ ํตํด ํ์ง ์๊ณ 2์ฐจ์ ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ์ ๋ต์ ์ฐพ์ ์ ์๋ค.
์ฝ๋
from sys import stdin
if __name__ == "__main__":
n = int(stdin.readline())
nums = list(map(int, stdin.readline().split()))
dp = [[0] * 21 for _ in range(n - 1)]
dp[0][nums[0]] = 1
for i in range(1, n - 1):
cur_num = nums[i]
for j in range(21):
if not dp[i - 1][j]:
continue
if j + cur_num <= 20:
dp[i][j + cur_num] += dp[i - 1][j]
if 0 <= j - cur_num:
dp[i][j - cur_num] += dp[i - 1][j]
print(dp[-1][nums[-1]])
'๐จโ๐ป ์ฝ๋ฉํ ์คํธ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค: 10942 ํฐ๋ฆฐ๋๋กฌ? (0) | 2020.08.30 |
---|---|
๋ฐฑ์ค: 15486 ํด์ฌ 2 (0) | 2020.08.29 |
๋ฐฑ์ค: 12865 ํ๋ฒํ ๋ฐฐ๋ญ (0) | 2020.08.28 |
๋ฐฑ์ค: 1495 ๊ธฐํ๋ฆฌ์คํธ (0) | 2020.08.27 |
๋ฐฑ์ค: 11058 ํฌ๋ฆฌ๋ณด๋ (0) | 2020.08.26 |