사용자 도구

사이트 도구


ps:problems:boj:9461

파도반 수열

ps
링크acmicpc.net/…
출처BOJ
문제 번호9461
문제명파도반 수열
레벨실버 3
분류

DP

시간복잡도O(n+t)
인풋사이즈t<=?, n<=100
사용한 언어Python
제출기록29200KB / 80ms
최고기록32ms
해결날짜2021/08/17

풀이

  • 간단한 1차원 DP. 그림을 잘 보면 P(n) = P(n-1) + P(n-6) 의 점화식을 쉽게 발견할수 있다.
  • 선형점화식이므로 n번째 항의 값을 O(logn)에 계산하는 것도 가능하지만, 문제에서 주어지는 n의 범위가 최대 100으로 매우 작고 여러개의 쿼리를 처리해야 하므로, 그냥 P(1)~P(n)을 O(n)에 구해두고 쿼리마다 값을 출력하는 것이 더 낫다.
  • 벌러캠프-매시 알고리즘을 공부할때 이 문제를 연습문제로 사용했었는데, 점화식의 계수가 1,0,0,0,0,1 이 아니라 1,1,0 으로 나와서 구현이 잘못된줄 알고 한참 삽질한적이 있다.. 알고보니 파도반 수열의 점화식은 P(n) = P(n-2) + P(n-3) 으로 쓰는것도 가능했다.. (사실 이게 더 일반적)
  • 문제와는 관계 없지만 파도반 수열에는 여러가지 특징이 있긴 하다. Padovan sequence 참고.

코드

"""Solution code for "BOJ 9461. 파도반 수열".

- Problem link: https://www.acmicpc.net/problem/9461
- Solution link: http://www.teferi.net/ps/problems/boj/9461

Tags: [DP]
"""


def main():
    T = int(input())
    N = [int(input()) for _ in range(T)]
    dp = [None, 1, 1, 1, 2, 2]
    for _ in range(6, max(N) + 1):
        dp.append(dp[-1] + dp[-5])
    for x in N:
        print(dp[x])


if __name__ == '__main__':
    main()

토론

댓글을 입력하세요:
T D W E B
 
ps/problems/boj/9461.txt · 마지막으로 수정됨: 2023/08/04 08:11 저자 teferi