37# include <gtest/gtest.h>
51 for (
size_t i = 0; i <
sub.size(); ++i)
53 while (pos < seq.
size()
and seq[pos] != sub[i])
55 if (pos == seq.
size())
69 for (
size_t i = 0; i < seq.
size(); ++i)
72 for (
size_t j = 0; j < i; ++j)
73 if (seq[j] < seq[i]
and dp[j] + 1 > dp[i])
87 for (
size_t i = 0; i < seq.
size(); ++i)
90 for (
size_t j = 0; j < i; ++j)
91 if (seq[j] <= seq[i]
and dp[j] + 1 > dp[i])
121 Array<int> seq = {10, 9, 2, 5, 3, 7, 101, 18};
127 for (
size_t i = 1; i <
r.subsequence.size(); ++i)
157 Array<int> seq = {10, 9, 2, 5, 3, 7, 101, 18};
169 for (
size_t i = 1; i <
r.subsequence.size(); ++i)
192 for (
size_t i = 1; i <
r.subsequence.size(); ++i)
203 for (
size_t i = 1; i <
r.subsequence.size(); ++i)
211 std::mt19937
rng(12345);
214 const size_t n = 20 +
rng() % 60;
216 for (
size_t i = 0; i < n; ++i)
217 arr.
append(
static_cast<int>(
rng() % 200) - 100);
225 <<
"Mismatch at trial " <<
trial;
227 <<
"Mismatch at trial " <<
trial;
230 for (
size_t i = 1; i <
lis.subsequence.size(); ++i)
237 std::mt19937
rng(98765);
240 const size_t n = 20 +
rng() % 60;
242 for (
size_t i = 0; i < n; ++i)
243 arr.
append(
static_cast<int>(
rng() % 40));
249 <<
"Mismatch at trial " <<
trial;
251 for (
size_t i = 1; i <
lnds.subsequence.size(); ++i)
Longest Increasing Subsequence (LIS) via patience sorting.
Simple dynamic array with automatic resizing and functional operations.
static Array create(size_t n)
Create an array with n logical elements.
constexpr size_t size() const noexcept
Return the number of elements stored in the stack.
constexpr bool is_empty() const noexcept
Checks if the container is empty.
T & append(const T &data)
Append a copy of data
static bool is_subsequence(const Array< Point > &original, const Array< Point > &sub)
Main namespace for Aleph-w library functions.
and
Check uniqueness with explicit hash + equality functors.
LIS_Result< T > longest_nondecreasing_subsequence(const Array< T > &seq, Compare cmp=Compare())
Compute the Longest Non-Decreasing Subsequence.
Divide_Conquer_DP_Result< Cost > divide_and_conquer_partition_dp(const size_t groups, const size_t n, Transition_Cost_Fn transition_cost, const Cost inf=dp_optimization_detail::default_inf< Cost >())
Optimize partition DP using divide-and-conquer optimization.
LIS_Result< T > longest_increasing_subsequence(const Array< T > &seq, Compare cmp=Compare())
Compute the Longest Increasing Subsequence (patience sorting).
size_t lis_length(const Array< T > &seq, Compare cmp=Compare())
Compute only the length of the LIS (no reconstruction).
double sub(double a, double b)