[๋ฐฑ์ค 1563 ๐ฅ] ๊ฐ๊ทผ์
https://www.acmicpc.net/problem/1563
1563๋ฒ: ๊ฐ๊ทผ์
๋ฐฑ์ค์คํ๊ต์์๋ ํ๊ธฐ๊ฐ ๋๋ ๋ฌด๋ ต์ ์ถ๊ฒฐ์ฌํญ์ ๋ณด๊ณ ๊ฐ๊ทผ์์ ์ค ๊ฒ์ธ์ง ๋ง ๊ฒ์ธ์ง ๊ฒฐ์ ํ๋ค. ์ด ํ๊ต๋ ์ด์ํด์ ํ์๋ค์ด ํ๊ต๋ฅผ ๋๋ฌด ์์ฃผ ๋น ์ง๊ธฐ ๋๋ฌธ์, ๊ฐ๊ทผ์์ ์ฃผ๋ ์กฐ๊ฑด์ด ์กฐ๊ธ ๋
www.acmicpc.net
๋ฌธ์
๋ฐฑ์ค์คํ๊ต์์๋ ํ๊ธฐ๊ฐ ๋๋ ๋ฌด๋ ต์ ์ถ๊ฒฐ์ฌํญ์ ๋ณด๊ณ ๊ฐ๊ทผ์์ ์ค ๊ฒ์ธ์ง ๋ง ๊ฒ์ธ์ง ๊ฒฐ์ ํ๋ค. ์ด ํ๊ต๋ ์ด์ํด์ ํ์๋ค์ด ํ๊ต๋ฅผ ๋๋ฌด ์์ฃผ ๋น ์ง๊ธฐ ๋๋ฌธ์, ๊ฐ๊ทผ์์ ์ฃผ๋ ์กฐ๊ฑด์ด ์กฐ๊ธ ๋ ํนํ๋ค.
์ถ๊ฒฐ์ฌํญ์ด ๊ธฐ๋ก๋๋ ์ถ๊ฒฐ์ ์ถ์, ์ง๊ฐ, ๊ฒฐ์์ด๋ค.
๊ฐ๊ทผ์์ ๋ฐ์ ์ ์๋ ์ฌ๋์ ์ง๊ฐ์ ๋ ๋ฒ ์ด์ ํ๊ฑฐ๋, ๊ฒฐ์์ ์ธ ๋ฒ ์ฐ์์ผ๋ก ํ ์ฌ๋์ด๋ค.
ํ ํ๊ธฐ๊ฐ 4์ผ์ด๊ณ , O๋ฅผ ์ถ์, L์ ์ง๊ฐ, A๋ฅผ ๊ฒฐ์์ด๋ผ๊ณ ํ์ ๋, ๊ฐ๊ทผ์์ ๋ฐ์ ์ ์๋ ์ถ๊ฒฐ์ ๋ณด๋
OOOO OOOA OOOL OOAO OOAA OOAL OOLO OOLA OAOO OAOA
OAOL OAAO OAAL OALO OALA OLOO OLOA OLAO OLAA AOOO
AOOA AOOL AOAO AOAA AOAL AOLO AOLA AAOO AAOA AAOL
AALO AALA ALOO ALOA ALAO ALAA LOOO LOOA LOAO LOAA
LAOO LAOA LAAO
์ด 43๊ฐ์ง์ด๋ค.
ํ ํ๊ธฐ๋ N์ผ์ด๋ค. N์ด ์ฃผ์ด์ก์ ๋, ๊ฐ๊ทผ์์ ๋ฐ์ ์ ์๋ ์ถ๊ฒฐ์ ๋ณด์ ๊ฐ์๋ฅผ ์ธ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค. N์ 1,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ ๋ต์ 1,000,000์ผ๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๋ค.

๋ฌธ์ ํ์ด
import sys
sys.setrecursionlimit(10**5)
n=int(sys.stdin.readline())
dp=[[[-1]*3 for _ in range(4)] for _ in range(n+1)]
def find_case(length, late, absent):
global n
if late>=2 or absent>=3:
return 0
if length==n:
return 1
if dp[length][late][absent]==-1:
dp[length][late][absent]=(find_case(length+1, late, 0)
+find_case(length+1, late+1, 0)
+find_case(length+1, late, absent+1))%1000000
return dp[length][late][absent]
else:
return dp[length][late][absent]
print(find_case(0,0,0))
- DP+DFS๋ฅผ ์ด์ฉํ ๋ฌธ์ ์๋ค.
- ์ด๋ฐ ์ ํ์ด ์ฌ์ ํ ์ด๋ ต๋ค ใ ใ ๊ฐ ๊ธธ์ด ๋ฉ๋ค..!!
- DP๋ฅผ ์ด์ฉํด์ ์ด์ ์ ๊ณ์ฐํ ๊ฐ๋ค์ ์ ์ฅํด๋๊ณ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค.
- DP[n][late][absent] = num
- N์ผ์งธ์ ์ง๊ฐ late๋ฒ, ์ฐ์ ๊ฒฐ์ absent๋ฒํ ๋ฌธ์์ด์ ๊ฒฝ์ฐ์ ์๊ฐ num๊ฐ๋ผ๋ ๋ป์ด๋ค.
- find_case ํจ์๋ฅผ ์ฌ์ฉํด์ ํ ํ๊ธฐ๊ฐ 4์ผ์ผ ๋์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค.
- find_case(0,0,0)์์ ์์ํด์ n์ผ์ผ ๋ ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ์๋ฅผ DFS๋ก ํ์ํ๋ฉด์ ๊ตฌํ๋ค.
- length : ํ์ฌ๊น์ง ํ์ํ ๋ ์ง ์
- late : ์ง๊ฐ ์ผ์
- absent : ์ฐ์ ๊ฒฐ์ ์ผ์
- dp[length][late][absent]๊ฐ ์์ง ๊ณ์ฐ๋์ง ์์ -1์ธ ๊ฒฝ์ฐ, ๋ค์๊ณผ ๊ฐ์ด find_case๋ฅผ ์คํํ๊ณ ์ด ํจ์๋ค์ ๋ฆฌํด๊ฐ์ ๋ชจ๋ ๋ํด์ dp[length][late][absent]์ ์ ์ฅํ ๋ค ๋ฆฌํดํ๋ค.
- ํ์ฌ ์ํ์์ ์ถ์ํ๋ ๊ฒฝ์ฐ์ ์ find_case(length+1, late, 0)
- ํ์ฌ ์ํ์์ ์ง๊ฐํ๋ ๊ฒฝ์ฐ์ ์ find_case(length+1, late+1, 0)
- ํ์ฌ ์ํ์์ ๊ฒฐ์ํ๋ ๊ฒฝ์ฐ์ ์ find_case(length+1, late, absent+1)
- (์ฐ์ ๊ฒฐ์ ์ผ์์ด๋ฏ๋ก ์ถ์ํ๊ฑฐ๋ ์ง๊ฐํ๋ ๊ฒฝ์ฐ absent๋ ๋ฆฌ์ ๋๋ค.)
- find_case(length, late, absent)์์ late>=2์ด๊ฑฐ๋ absent>=3์ด๋ฉด 0์ ๋ฐํํ๊ณ , length๊ฐ n์ด๋ฉด 1์ ๋ฐํํ๋ค.
- ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์๋ ๊ฒฝ์ฐ dp[length][late][absent]๊ฐ ์ด๋ฏธ ๊ณ์ฐ๋์ด ์์ด์ dp ๋ฐฐ์ด์ ์ด๊ธฐํ ๊ฐ์ธ -1์ด ์๋๋ฉด dp[length][late][absent]๋ฅผ ๋ฐํํ๋ค. (์ด๋ฌํ ๊ณผ์ ์ ํตํด ์ด๋ฏธ ๊ณ์ฐํ ๊ฐ์ ๋ค์ ๊ณ์ฐํ์ง ์์์ผ๋ก์จ ์๊ฐ ์ด๊ณผ์ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๋ฅผ ๋ฐ์ง ์์ ์ ์๋ค!)
- dp[length][late][absent]==-1์ผ ๊ฒฝ์ฐ, dp ๊ฐ์ ๊ณ์ฐํ๋ค.