Najdłuższy podciąg rosnący.

0

Witam, w starych notatkach w zeszycie miałem kod programu na najdłuższy podciąg rosnący. Okazało się, że jest mi on teraz potrzebny, ale nie mogę rozgryźć pewnego fragmentu chaotycznego zapisu zeszytowego. Rozumiem, jak działa sam algorytm, ale jakoś nie mogę rozszyfrować co dzieje się (a raczej jak powinno być prawidłowo zapisane) w kilku linijkach.

#include <iostream>

using namespace std;

int main()
{
int n, num, maks, maksimum;
cin >>n;
int tab1[n], tab2[n];

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

for (int i=n-1; i>=0; i--)
{
    if (i==n-1)
    tab2[i]=1;
  
    else
    {
        for (int j=i; j<=n-1; j++)
        {
            if (tab1[i]<tab1[j])
            {
            if (tab1[j]<num)
                {num=tab1[j];
                maks = tab2[j];
                }
            }
    }
    tab2[i]=maks+1;   
    }


}

for (int i=0; i<n; i++)
{
    if (tab2[i]>maksimum)
    maksimum=tab2[i];
}

cout << maksimum;

cin.ignore();
getchar();
return 0;
}

Chodzi mi o mniej więcej ten fragment:

if (tab1[i]<tab1[j])
            {
            if (tab1[j]<num)
                {num=tab1[j];
                maks = tab2[j];
                }
            } 

Nie wykluczam, że pochrzaniłem coś również w innym miejscu :P. Proszę o pomoc z i góry dziękuję za odpowiedzi.

0

Jaka jest wartość num przy pierwszej iteracji podczas sprawdzania warunku.

0

masz prostsze rozwiązanie:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
  int n;
  cin >> n;
  vector<int> v(n,n+1);
  int k = 0;
  while (n--)
    {
      int a;
      cin >> a;
      vector<int>::iterator end = v.begin()+k;
      vector<int>::iterator it = lower_bound(v.begin(),end,a);
      if (it==end)
        k++;
      *it = a;
    }
  cout << k;
  return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1