์๊ณ ๋ฆฌ์ฆ/DP
[๋ฐฑ์ค 9095 ๐ฅ] 1,2,3 ๋ํ๊ธฐ
1eehyunji
2023. 11. 2. 02:16
https://www.acmicpc.net/problem/9095
9095๋ฒ: 1, 2, 3 ๋ํ๊ธฐ
๊ฐ ํ ์คํธ ์ผ์ด์ค๋ง๋ค, n์ 1, 2, 3์ ํฉ์ผ๋ก ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
www.acmicpc.net
๋ฌธ์
์ ์ 4๋ฅผ 1, 2, 3์ ํฉ์ผ๋ก ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ ์ด 7๊ฐ์ง๊ฐ ์๋ค. ํฉ์ ๋ํ๋ผ ๋๋ ์๋ฅผ 1๊ฐ ์ด์ ์ฌ์ฉํด์ผ ํ๋ค.
- 1+1+1+1
- 1+1+2
- 1+2+1
- 2+1+1
- 2+2
- 1+3
- 3+1
์ ์ n์ด ์ฃผ์ด์ก์ ๋, n์ 1, 2, 3์ ํฉ์ผ๋ก ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค๋ ํ ์ค๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ์ ์ n์ด ์ฃผ์ด์ง๋ค. n์ ์์์ด๋ฉฐ 11๋ณด๋ค ์๋ค.
์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค๋ง๋ค, n์ 1, 2, 3์ ํฉ์ผ๋ก ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.

๋ฌธ์ ํ์ด
- DP๋ฅผ ์ด์ฉํด์ ๊ฐ๋จํ๊ฒ ํ ์ ์๋ ๋ฌธ์ ๋ค!
- dp[num]์ 1,2,3์ ๋ํด์ num์ ๊ตฌํ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ค.
- ๋จผ์ , 0, 1, 2, 3 ๊น์ง๋ ๊ฐ๋จํ๊ฒ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ ์ ์์ผ๋ฏ๋ก ์๋ ์ฃผ์๊ณผ ๊ฐ์ด ๊ฐ๋ฅํ ์์ ๊ตฌํด์ index=3๊น์ง dp ๊ฐ์ ์ ์ฅํด์ค๋ค.
- 4๋ถํฐ๋ dp[4-1]('3'+1, '1+2'+1, '2+1'+1, '1+1+1'+1)+dp[4-2]('2'+2, '1+1'+2)+dp[4-3]('1'+3) ์ผ๋ก, dp[n-1]+dp[n-2]+dp[n-3]์ ๋ํ๋ฉด ์ ์๊ณผ ๊ฐ์ด ๋์ผํจ์ ํ์ธํ ์ ์๋ค.
- ๊ณ์ฐํ ๊ฐ์ dp์ ๋ฃ์ด์ฃผ๋ฉด์ n๊น์ง ๋ฐ๋ณตํ ๋ค์ dp[n]์ ์ถ๋ ฅํ๊ณ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํ๋ค.
import sys
t=int(sys.stdin.readline())
for _ in range(t):
n=int(sys.stdin.readline())
# dp[0]=0, dp[1]=1 ('1'), dp[2]=2 ('2','1+1'), dp[3]=4 ('3','1+2','2+1','1+1+1')
dp = [0, 1, 2, 4]
for i in range(4, n + 1):
dp.append(dp[i - 3] + dp[i - 2] + dp[i - 1])
print(dp[n])