Еще один подход для нахождения максимально увеличивающейся подпоследовательности

Я знаю, что существует много алгоритмов для нахождения самой длинной увеличивающейся подпоследовательности, но все алгоритмы, использующие DP, имеют это общее — они рекурсивно / динамально вычисляют самую длинную подпоследовательность «ENDING» в конкретном элементе массива.

Я написал решение, которое использует самую длинную подпоследовательность, начинающуюся с определенного массива, что, похоже, тоже работает нормально.

#include<iostream>
using namespace std;
#define boostio ios_base::sync_with_stdio(0);

int n;
int a[100000];
int t[100000] = {-1};

int lis(int i){

if(t[i]!= -1){
return t[i];
}

if(i == n){t[i] = 1; return 1;
}

for (int x = i+1; x <= n ; ++x)
{
if(a[x] > a[i] and 1 + lis(x) > t[i]){
t[i] = 1 + lis(x);
//return t[i];
}}

if(t[i] != -1){
return t[i];
}

t[i] = 1; return 1;}
int main(){
boostio;
cin >> n;

for (int i = 1; i <= n; ++i)
{
cin >> a[i];
}

fill(t, t + n+2 ,-1);

Int m = 0;

for (int i = 1; i <= n; ++i)
{
//cout << i << " " << lis(i) << endl;
if(lis(i) >m) m= lis(i);
}

cout << m;

return 0;
}

Мне интересно, это чем-то хуже, чем если бы мы использовали «последний элемент» подпоследовательности вместо первого. Они оба кажутся мне алгоритмами порядка n квадрата, так почему этот алгоритм не более распространен. Мне это кажется более интуитивным. Я что-то пропустил?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]