LIS。鉄則本の問題なのでコードのみ。
問題概要
長さ の数列 の LIS の長さを求めよ。
制約
コード
#include <bits/stdc++.h> using namespace std; const int INF = 1 << 29; int main() { int N, res = 0; cin >> N; vector<int> A(N); for (int i = 0; i < N; i++) cin >> A[i]; // dp[v] := A から長さ v の IS をとったときの、最終項の値の最小値 vector<int> dp(N+1, INF); dp[0] = 0; for (int i = 0; i < N; i++) { int j = lower_bound(dp.begin(), dp.end(), A[i]) - dp.begin(); dp[j] = A[i]; res = max(res, j); } cout << res << endl; }