algorithm/문제
[Python]백준 1309/동물원/dp
유랄라-
2022. 3. 3. 22:16
반응형
https://www.acmicpc.net/problem/1309
1309번: 동물원
첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다.
www.acmicpc.net
⚡️ 문제 설명
2*N 배열에 사자를 배치하는 경우의 수가 몇 가지인지를 알아내는 프로그램
⚡️ 해결 방법
#왼쪽에 있는 경우
dp[i][0]=(dp[i-1][1]+dp[i-1][2])%9901
#오른쪽에 있는 경우
dp[i][1]=(dp[i - 1][0] + dp[i - 1][2])%9901
#둘다 없는 경우
dp[i][2]=(dp[i - 1][0]+ dp[i - 1][1] + dp[i - 1][2])%9901
🟢 왼쪽에 있는 경우 = 전단계에서 오른쪽에 있는 경우 ☑️ + 그 전단계에서 둘다 없는 경우
dp[i][0]=(dp[i-1][1]+dp[i-1][2]) % 9901
☑️ | |
🟢 | |
🔵 오른쪽에 있는 경우 = 전단계에서 왼쪽에 있는 경우 ☑️ + 그 전단계에서 둘다 없는 경우
dp[i][1]=(dp[i - 1][0] + dp[i - 1][2]) % 9901
☑️ | |
🔵 | |
🔴 둘다 없는 경우 = 전단계에서 왼쪽에 있는 경우 + 전단계에서 오른쪽에 있는 경우 + 전단계에서 둘다 없는 경우
dp[i][2]=(dp[i - 1][0]+ dp[i - 1][1] + dp[i - 1][2]) % 9901
dp
왼쪽 | 오른쪽 | 둘 다 X | |
dp[0] | 1 | 1 | 1 |
dp[1] | 2 | 2 | 3 |
dp[2] | 5 | 5 | 7 |
dp[3] | 12 | 12 | 17 |
결과 = sum(dp[n-1])%9901 = (12 + 12 + 17)%9901 = 41
⚡️ 코드
import sys
input = sys.stdin.readline
n=int(input())
dp = [[1] * 3 for _ in range(n)]
for i in range(1,n):
#왼쪽에 있는 경우
dp[i][0]=(dp[i-1][1]+dp[i-1][2])%9901
#오른쪽에 있는 경우
dp[i][1]=(dp[i - 1][0] + dp[i - 1][2])%9901
#둘다 없는 경우
dp[i][2]=(dp[i - 1][0]+ dp[i - 1][1] + dp[i - 1][2])%9901
print(sum(dp[n-1])%9901)
반응형