https://www.acmicpc.net/problem/16456

n개의 섬으로 구성되어 있습니다.i+1)으로 이동할 수 있습니다.i+2)으로 이동할 수 있습니다.i-1)으로 이동할 수 있습니다.1번)에서 시작해야 합니다.1을 출력하고, 이어서 각 초등학교별로 짝의 수를 출력합니다.0을 출력합니다.주어진 문제는 각 섬에 도달하는 방법의 수를 효율적으로 계산하기 위해 동적 계획법(DP)을 활용할 수 있습니다. DP는 복잡한 문제를 간단한 하위 문제로 나누어 해결하는 방식으로, 이 문제에서는 각 섬에 도달하는 방법의 수를 단계별로 계산합니다.
dp[i]: i번째 섬에 도달하는 여행 방법의 수를 저장합니다.dp[n]을 계산하여 출력합니다.섬 i에 도달하는 방법은 다음과 같이 두 가지 경우로 나눌 수 있습니다:
i-1)에서 이동: i-1번째 섬에 도달한 모든 방법에서 i번째 섬으로 이동합니다.i-3번째 섬에서 이동: i-3번째 섬에서 한 번의 건너뛰기를 통해 i번째 섬으로 이동합니다.따라서, 점화식은 다음과 같이 설정됩니다:
dp[i] = dp[i-1] + dp[i-3]
dp[1] = 1: 첫 번째 섬은 시작점이므로 유일한 방법은 1입니다.dp[2] = 1: 두 번째 섬으로 이동하는 유일한 방법은 1 -> 2입니다.dp[3] = 2: 세 번째 섬으로 가는 방법은 두 가지가 있습니다:1 -> 2 -> 31 -> 31 ≤ n ≤ 50,000이므로, 효율적인 계산을 위해 반복문을 사용합니다.1,000,000,009로 나눈 나머지를 저장합니다.
# 동적 계획법을 이용한 여행 방법 계산
MOD = 1000000009 # 모듈러 값
def main():
import sys
input = sys.stdin.readline
N = int(input()) # 섬의 개수
dp = [0] * (N + 4) # 안전하게 인덱스 범위 설정
dp[1] = 1 # 첫 번째 섬에 도달하는 방법은 1가지
if N >= 2:
dp[2] = 1 # 두 번째 섬에 도달하는 방법은 1가지
if N >= 3:
dp[3] = 2 # 세 번째 섬에 도달하는 방법은 2가지
for i in range(4, N + 1):
dp[i] = (dp[i - 1] + dp[i - 3]) % MOD # 점화식 적용
print(dp[N]) # 결과 출력
if __name__ == "__main__":
main()
MOD = 1000000009 # 모듈러 값
N = int(input()) # 섬의 개수
dp = [0] * (N + 4) # DP 배열 초기화
dp[1] = 1 # 첫 번째 섬 도달 방법
MOD: 결과가 클 수 있으므로, 모든 계산은 1,000,000,009로 나눈 나머지를 취합니다.N: 섬의 총 개수를 입력받습니다.dp 배열: 섬의 개수 N에 맞게 크기를 설정합니다. 인덱스 초과를 방지하기 위해 N + 4로 설정합니다.dp[1] = 1로 설정합니다.if N >= 2:
dp[2] = 1 # 두 번째 섬 도달 방법
if N >= 3:
dp[3] = 2 # 세 번째 섬 도달 방법
1 -> 2로만 이동 가능하므로 dp[2] = 1.dp[3] = 2:1 -> 2 -> 31 -> 3for i in range(4, N + 1):
dp[i] = (dp[i - 1] + dp[i - 3]) % MOD # 점화식 적용
dp[i] = dp[i-1] + dp[i-3]dp[i-1]: i-1번째 섬에 도달하는 모든 방법에서 i번째 섬으로 한 칸 이동.dp[i-3]: i-3번째 섬에 도달하는 모든 방법에서 세 칸 이동 (i-3 -> i-2 -> i-1 -> i), 즉, 한 번의 건너뛰기 이동.1,000,000,009로 나눈 나머지를 저장하여, 큰 수를 방지합니다.print(dp[N]) # 결과 출력
dp[N]: N번째 섬에 도달하는 총 여행 방법의 수를 출력합니다.4부터 N까지 반복문을 돌며 dp[i]를 계산합니다. 각 i에 대해 상수 시간 내에 계산이 이루어지므로 전체적으로 선형 시간입니다.N에 비례하는 선형 시간 복잡도를 가집니다. N의 최대 값이 50,000이므로, 효율적으로 계산이 가능합니다.dp 배열은 N + 4 크기로 할당되며, 각 섬에 대한 방법의 수를 저장합니다.MOD, i 등)은 상수 공간을 사용합니다.N의 최대 값이 50,000이므로, 메모리 사용도 효율적입니다.dp[i]는 i번째 섬에 도달하는 모든 가능한 여행 방법의 수입니다.css
코드 복사
dp[i] = dp[i-1] + dp[i-3]
i번째 섬에 도달하는 방법이 두 가지 경우로 나뉨을 의미합니다:i-1번째 섬에서 i번째 섬으로 한 칸 이동.i-3번째 섬에서 세 칸 이동하여 i번째 섬으로 도달.dp 배열:O(1) 시간에 특정 인덱스에 접근 가능.1,000,000,009로 나눈 나머지를 취합니다. dp[i] = (dp[i - 1] + dp[i - 3]) % MOD