๐ฑ ๋ฌธ์
๐ฑ ํ์ด1 - ๋ฐฑํธ๋ํน ํ์ด(์๊ฐ ์ด๊ณผ)
m๊ฐ์ ์์ฐ ์ ์ค์์ n๊ฐ๋ฅผ ๊ณ ๋ฅด๋ ๋ฌธ์ ๋ผ ๋น์ฐํ ๋ฐฑํธ๋ํน์ด๋ผ๊ณ ์๊ฐํ๊ณ ์ฒ์์๋ ๋ฐฑํธ๋ํน์ผ๋ก ํ์์ต๋๋ค.
def backtracking(n, m, lotto):
if len(lotto) == n - 1:
global answer
answer += (m - (lotto[-1] * 2) + 1)
return
for i in range(lotto[-1]*2, m + 1):
tmp = i
for j in range(n - len(lotto) - 1):
tmp *= 2
if tmp > m:
return
lotto.append(i)
backtracking(n, m, lotto)
lotto.pop()
t = int(input())
for _ in range(t):
n, m = map(int, input().split())
answer = 0
for i in range(1, m + 1):
backtracking(n, m, [i])
print(answer)
์๊ฐ ์ด๊ณผ๊ฐ ๋ ์ ์ด๋ป๊ฒ๋ ์๊ฐ ์ด๊ณผ๋ฅผ ์ค์ฌ๋ณด๊ณ ์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ต๋๋ค.
- ๋ง์ฝ ํ์ฌ
lotto
์ ๋ด๊ฒจ ์๋ ์ซ์ ์ค ๋ง์ง๋ง ์ซ์๋ก ๋ ๋ฐฐ์ฉ ๋๋ ธ์ ๋m
๋ณด๋ค ์ปค์ง๋ฉด ๋๊น์งlotto
๋ฅผ ๋ง๋ค ์ ์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก ๋ฐ๋กreturn
lotto
๊ฐn
์ด ๋ ๋๊น์ง ํ์ํ์ง ์๊ณn - 1
์ด ๋ ๋๊น์ง ํ์ (→ ์ด๊ฒ ๋ฌด์จ ์๋ฏธ์ธ์ง,, ๋ฉ์ฒญํ ๋..โก) (๊ทผ๋ฐ ๊ฒฐ๊ตญ ํ์์ด ์๋๋ผ count๋ฅผ ์ธ๋ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค๋ ์ฌ์ค์ ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด์ ๊นจ๋ฌ์์ต๋๋ค.)
๊ฒฐ๊ตญ ํ์์ด ์๋๋ผ ๋ง๋ค ์ ์๋ ๋ก๋์ ๊ฐ์๋ฅผ ์ ์ฅํด๋๊ณ ๊ณ์ฐํ๋ ์์ผ๋ก ํ์ด์ผ ๊ฒ ๋ค๊ณ ์๊ฐํ์ฌ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ์ด์ฉํ์ฌ ํ์ด๋ฅผ ํ์์ต๋๋ค.
๐ฑ ํ์ด2 - ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ํ์ด
์ด ๋ฌธ์ ์์๋ DP ๋ฐฐ์ด์ด 2์ฐจ์์ด์ด์ผ ํฉ๋๋ค. ์๋ํ๋ฉด dp[i][j]
์ j
์ดํ์ ์์ฐ์๋ก ๊ธธ์ด i
์ ๋ก๋๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ ์ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
t = int(input())
for _ in range(t):
n, m = map(int, input().split())
dp = [[0]*(m+1) for _ in range(n+1)]
for i in range(m + 1):
dp[1][i] = i
for i in range(2, n + 1):
for j in range(1, m + 1):
dp[i][j] = dp[i][j-1]+dp[i-1][j//2]
print(dp[n][m])
dp[i][j]
์๋j
์ดํ์ ์์ฐ์๋ก ๋ก๋ ์ซ์i
๊ฐ๋ฅผ ๊ณ ๋ฅด๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ ์ฅํฉ๋๋ค.dp[i][j] = dp[i][j-1] + dp[i-1][j//2]
๋ก ๊ตฌํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, n=4์ด๊ณ , m=10์ธ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. 10์ดํ์ ์์ฐ์๋ก ๋ฌธ์ ์์ ์ฃผ์ด์ง ๊ท์น๋๋ก ๋ก๋ ๋ฒํธ 4๊ฐ๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์๊ฐํด์ผ ํฉ๋๋ค. ์ฆ,
dp[4][10]
์ ๊ตฌํ๋ฉด ๋ฉ๋๋ค.
์ด๋,dp[4][10]
๋dp[3][5] + dp[4][9]
๋ก ๊ณ์ฐ๋ ์ ์์ต๋๋ค. ์๋ํ๋ฉด 10์ดํ์ ์์ฐ์๋ก ๋ก๋ ๋ฒํธ 4๊ฐ๋ฅผ ๊ณ ๋ฅด๋ฉด ๋๋ฏ๋ก 9์ดํ์ ์์ฐ์๋ก 4๊ฐ์ ๋ก๋ ๋ฒํธ๋ฅผ ๊ณ ๋ฅด๋ ๊ฒฝ์ฐ๊ฐ ํฌํจ๋๊ณ , 5์ดํ์ ์์ฐ์๋ก 3๊ฐ๋ฅผ ๊ณจ๋ผ๋์ ๊ฒฝ์ฐ์ 5์ 2๋ฐฐ์ธ 10์ ์ถ๊ฐ๋ก ๋ฃ์ด์ฃผ๋ฉด๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
๐ฑ ์ ๋ต ์ฝ๋
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# boj 2758 ๋ก๋
# DP ํ์ด
t = int(input())
for _ in range(t):
n, m = map(int, input().split())
dp = [[0]*(m+1) for _ in range(n+1)]
for i in range(m + 1):
dp[1][i] = i
for i in range(2, n + 1):
for j in range(1, m + 1):
dp[i][j] = dp[i][j-1]+dp[i-1][j//2]
print(dp[n][m])
์ญ์ DP๋ฌธ์ ๋ ์ ํ์์ ์๊ฐํด๋ด๋ฉด ๊ตฌํ์ ์ ๋ง ์ฌ์ด๋ฐ, ์ ํ์์ ์๊ฐํด๋ด๋๊ฒ ์ฐธ ์ด๋ ค์ด ๊ฒ ๊ฐ์ต๋๋ค..๐ซ
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] #15486 ํด์ฌ2 (Python, Dynamic Programming, ์๊ฐ ์ด๊ณผ ํด๊ฒฐ) (0) | 2023.10.15 |
---|---|
[BOJ] #4179 ๋ถ! (Python, BFS) (1) | 2023.10.14 |
[BOJ] #15649) N๊ณผ M(1) (Python, Back tracking) (1) | 2023.10.01 |
[BOJ] 11729 ํ๋ ธ์ด ํ ์ด๋ ์์ (Python, Recursion) (0) | 2023.09.30 |
[ํ๋ก๊ทธ๋๋จธ์ค] ๊ด๋ฌผ ์บ๊ธฐ (Python, ๊ตฌํ) (0) | 2023.09.30 |
๋๊ธ