์•Œ๊ณ ๋ฆฌ์ฆ˜/DP

[๋ฐฑ์ค€ 1563 ๐Ÿฅ‡] ๊ฐœ๊ทผ์ƒ

1eehyunji 2023. 8. 24. 00:27

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 ๊ฐ’์„ ๊ณ„์‚ฐํ•œ๋‹ค.

n=4์ผ ๋•Œ dp+dfs ๊ณผ์ •