問題
D – トランプ挿入ソート
最長増加部分列(LIS)の問題です。
以下、Pythonでの最長増加部分列(LIS)の実装について、とても分かりやすく説明しています。
最長増加部分列の長さ取得アルゴリズムLISをpythonで書いてみる
また、Pythonには2分探索が標準ライブラリに用意されています。
回答
import bisect # 二分探索 import sys # input処理を高速化する input = sys.stdin.readline def main(): N = int(input()) lst_c = [int(input()) for _ in range(N)] dp = [float('inf')] for c in lst_c: # dpの最後の要素よりcが大きい場合、cを最後に付けて、一つ大きい部分列を作る。 if c > dp[-1]: dp.append(c) # 2分探索をしてcより大きいものを上書き else: pos_insert = bisect.bisect_left(dp, c) dp[pos_insert] = c print(N - len(dp)) main()