sto cercando di risolvere il seguente problema:più lunga sottosequenza che prima aumenta poi diminuisce
Una sequenza in cui è chiamato il valore di primi elementi di flessione e quindi aumentare V- Sequence. In una sequenza V valida, dovrebbe esserci almeno un elemento nel diminuire e almeno un elemento nel braccio crescente.
Ad esempio, "5 3 1 9 17 23" è una sequenza V valida avente due elementi nel braccio decrescente cioè 5 e 3 e 3 elementi nel braccio crescente cioè 9, 17 e 23. Ma nessuna delle sequenze "6 4 2" o "8 10 15" è V-Sequence poiché "6 4 2" non ha alcun elemento nella parte crescente mentre "8 10 15" non ha alcun elemento nella parte decrescente.
Una sottocategoria di una sequenza viene ottenuta eliminando zero o più elementi dalla sequenza. Ad esempio, definizione "7", "2 10", "8 2 7 6", "8 2 7 10 6" ecc. Sono sotto-sequenze valide di "8 2 7 10 6"
Data una sequenza di numeri N trova la sua sotto-sequenza più lunga che è una sequenza-V.
Attualmente ho una soluzione in cui ho inizializzare un array (m []) in modo tale che ciascun m [i] contiene le sequenze crescenti più lunghi a partire da 'i' all'interno della matrice O (n^2).
Analogamente, inizializzo un altro array (d []), in modo tale che ogni d [i] contenga la sequenza decrescente più lunga ENDING in quel punto.
Entrambe queste operazioni richiedono O (n^2)
ora passare attraverso queste matrici e selezionare il valore massimo di m [i] + d [i] -1, in modo tale che le condizioni richieste sono soddisfatte.
Quello che voglio sapere è - C'è una soluzione O (n lg n) ?? Perché la mia soluzione non viene eseguita entro i limiti di tempo richiesti. Grazie :)
CODICE:
#include<cstdio>
#include<algorithm>
using namespace std;
int m[ 200000 ];
int d[200000 ];
int n;
int arr[200000 ];
void LIS()
{
m[ n-1 ] = 1;
int maxvPos = -1;
int maxv = -1;
for(int i=n-2; i>=0; i--)
{
maxv = -1;
for(int j=i+1; j<n; j++)
{
if((m[j]+1 > maxv) && (arr[i] < arr[j]))
{
maxv = m[j]+1;
maxvPos = j;
}
}
if(maxv>0)
{
m[i] = maxv;
}
else
m[i ] = 1;
}
}
void LDS()
{
d[0] = 1;
int maxv = -1;
int maxvPos = -1;
for(int i=1; i<n; i++)
{
maxv = -1;
for(int j=i-1; j>=0; j--)
{
if((d[j]+1 > maxv) && arr[j]>arr[i])
{
maxv = d[j]+1;
maxvPos = j;
}
}
if(maxv>0)
d[i] = maxv;
else
d[i]=1;
}
}
int solve()
{
LIS();
LDS();
int maxv = 0;
int curr = 0;
for(int i=0; i<n; i++)
{
curr = d[i] + m[i] -1 ;
if((d[i]>0) && (m[i]>0))
{
if(curr != 1)
maxv = max(curr, maxv);
}
}
return maxv;
}
/* static void printArr(int[] a)
{
for(int i : a)
System.out.print(i + " ");
System.out.println();
} */
int main()
{
scanf("%d", &n);
for(int i=0; i<n; i++)
{
scanf("%d", &arr[i]);
}
printf("%d\n", solve());
return 0;
}
E 'da un concorso di programmazione che ha avuto luogo ieri sera. La mia richiesta ha superato i timelimits per 6 casi su 11 di test. – arya