AlenAntonelli

LIS cuadrático (lineal en memoria)

Oct 24th, 2018
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.13 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. vector <int> LIS ( vector <int> &v )
  7. {
  8.     int n = v.size();
  9.     vector <int> Tam_lis (n, 1);
  10.     vector <int> padre (n, -1);
  11.    
  12.     int PosMaxLis = 0;
  13.    
  14.     for (int i=0; i<n; i++)
  15.     {
  16.         for (int j=i; j<n; j++)
  17.         {
  18.             if (v[j] > v[i])
  19.             {
  20.                 if (Tam_lis[i]+1 > Tam_lis[j])
  21.                 {
  22.                     Tam_lis[j] = Tam_lis[i]+1;
  23.                     padre[j] = i;
  24.                 }
  25.                 if (Tam_lis[j] > Tam_lis[ PosMaxLis ])
  26.                     PosMaxLis = j;
  27.             }
  28.         }
  29.     }
  30.    
  31.     vector <int> resultado;
  32.    
  33.     do
  34.     {
  35.         resultado.push_back( v[PosMaxLis] );
  36.         PosMaxLis = padre[PosMaxLis];
  37.     } while ( PosMaxLis != -1 );
  38.    
  39.     reverse( resultado.begin(), resultado.end() );
  40.    
  41.     return resultado;
  42. }
  43.  
  44. int main()
  45. {
  46.     vector <int> v = {2, 1, 2, 3, 5, 4, 5, 9, 8};
  47.    
  48.     vector <int> resultado = LIS (v);
  49.    
  50.     for (int i=0; i<resultado.size(); i++)
  51.         cout<<resultado[i]<<" ";
  52.  
  53.     return 0;
  54. }
Advertisement
Add Comment
Please, Sign In to add comment