From 4d8ead755c0dabd394fb7dcddbacccd7a7d2c899 Mon Sep 17 00:00:00 2001 From: Naum Azeredo Date: Thu, 4 Mar 2021 22:30:54 -0800 Subject: [PATCH 1/2] Refactor LIS code --- dynamic-programming/lis.cpp | 18 ++++++++++-------- tests/dynamic-programming/lis.test.cpp | 9 +++++---- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/dynamic-programming/lis.cpp b/dynamic-programming/lis.cpp index 8de03ea..898912a 100644 --- a/dynamic-programming/lis.cpp +++ b/dynamic-programming/lis.cpp @@ -3,13 +3,15 @@ // dp(i) = max j& a) { + vector dp (a.size(), 0x3f3f3f3f); + int res = 0; -memset(dp, 63, sizeof dp); -for (int i = 0; i < n; ++i) { - // increasing: lower_bound - // non-decreasing: upper_bound - int j = lower_bound(dp, dp + lis, v[i]) - dp; - dp[j] = min(dp[j], v[i]); - lis = max(lis, j + 1); + for (int v : a) { + int j = lower_bound(dp.begin(), dp.begin() + res, v) - dp.begin(); + dp[j] = min(dp[j], v); + res = max(res, j + 1); + } + + return res; } diff --git a/tests/dynamic-programming/lis.test.cpp b/tests/dynamic-programming/lis.test.cpp index b3366cc..9770c52 100644 --- a/tests/dynamic-programming/lis.test.cpp +++ b/tests/dynamic-programming/lis.test.cpp @@ -2,16 +2,17 @@ #include using namespace std; +// @include: dynamic-programming/lis.cpp + const int N = 2e5; int main() { - int dp[N], v[N], n, lis; + int n; cin >> n; + vector v(n); for (int i = 0; i < n; i++) cin >> v[i]; - // @include: dynamic-programming/lis.cpp - - cout << lis << endl; + cout << lis(v) << endl; } From 0ed48f0696827decded8e890a3fbd8eed9dea1c2 Mon Sep 17 00:00:00 2001 From: Mateus de Castro Date: Fri, 5 Mar 2021 14:36:08 -0300 Subject: [PATCH 2/2] Update lis.cpp --- dynamic-programming/lis.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dynamic-programming/lis.cpp b/dynamic-programming/lis.cpp index 898912a..511d60f 100644 --- a/dynamic-programming/lis.cpp +++ b/dynamic-programming/lis.cpp @@ -8,6 +8,8 @@ int lis(vector& a) { int res = 0; for (int v : a) { + // increasing: lower_bound + // non-decreasing: upper_bound int j = lower_bound(dp.begin(), dp.begin() + res, v) - dp.begin(); dp[j] = min(dp[j], v); res = max(res, j + 1);