사용자 도구

사이트 도구


ps:problems:boj:11055

가장 큰 증가 부분 수열

ps
링크acmicpc.net/…
출처BOJ
문제 번호11055
문제명가장 큰 증가 부분 수열
레벨실버 2
분류

segment tree

시간복잡도O(nlogm)
인풋사이즈n<=1000, m<=1000
사용한 언어Python
제출기록33968KB / 152ms
최고기록60ms
해결날짜2021/12/23

풀이

코드

DP (O(n^2))

"""Solution code for "BOJ 11055. 가장 큰 증가 부분 수열".

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

Tags: [LIS] [DP]
"""


def main():
    N = int(input())  # pylint: disable=unused-variable
    A = [int(x) for x in input().split()]

    dp = []
    for a_i in A:
        prev_max = max((dp_j for dp_j, a_j in zip(dp, A) if a_j < a_i),
                       default=0)
        dp.append(a_i + prev_max)

    print(max(dp))


if __name__ == '__main__':
    main()

Segment Tree (O(nlogm))

"""Solution code for "BOJ 11055. 가장 큰 증가 부분 수열".

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

Tags: [LIS] [Segment Tree]
"""

from teflib import segmenttree


def main():
    N = int(input())  # pylint: disable=unused-variable
    A = [int(x) for x in input().split()]

    size = max(A) + 1
    segtree = segmenttree.SegmentTree([0] * size, merge=max)
    for a_i in A:
        prev_max = segtree.query(0, a_i)
        segtree.set(a_i, prev_max + a_i)

    print(segtree.query(0, size))


if __name__ == '__main__':
    main()

토론

댓글을 입력하세요:
Y​ Y E D C
 
ps/problems/boj/11055.txt · 마지막으로 수정됨: 2021/12/23 12:02 저자 teferi