====== 추출하는 폴도 바리스타입니다 ====== ===== 풀이 ===== * DP형태로 점화식은 쉽게 세울수 있다. $ dp[i] = max_{j\in{P_i}}{dp[j]} + 1 $ 과 같은 형태이다. P_i는 S[i] 바로 앞에 올수있는 S[j]들의 인덱스들이다. 수식으로는 이런식..P_i = {j | j """Solution code for "BOJ 15648. 추출하는 폴도 바리스타입니다". - Problem link: https://www.acmicpc.net/problem/15648 - Solution link: http://www.teferi.net/ps/problems/boj/15648 Tags: [Segment tree] [DP] """ from teflib import segmenttree def main(): N, k, d = [int(x) for x in input().split()] S = [int(x) for x in input().split()] size = max(S) + 1 segtree = segmenttree.MinSegmentTree(size) max_vals_for_mod = [0] * k for s_i in S: max_in_mod = max_vals_for_mod[(mod := s_i % k)] beg = 0 if s_i < d else s_i - d end = size if size < (p := s_i + d + 1) else p max_in_range = -segtree.query(beg, end) dp_i = (max_in_range if max_in_range > max_in_mod else max_in_mod) + 1 max_vals_for_mod[mod] = dp_i segtree.set(s_i, -dp_i) print(max(max_vals_for_mod)) if __name__ == '__main__': main() * Dependency: [[:ps:teflib:segmenttree#MinSegmentTree|teflib.segmenttree.MinSegmentTree]] {{tag>BOJ ps:problems:boj:플래티넘_4}}