estoy tratando de resolver la siguiente pregunta: ¿subsecuencia más largo que el primero aumenta y luego disminuye
Una secuencia en la que el valor de los elementos primero y luego aumentar disminución se llama V-secuencia. En una V-Sequence válida, debe haber al menos un elemento en el elemento decreciente y al menos uno en el brazo creciente.
Por ejemplo, "5 3 1 9 17 23" es una secuencia V válida que tiene dos elementos en el brazo decreciente, a saber, 5 y 3, y 3 elementos en el brazo creciente, es decir, 9, 17 y 23. Pero ninguna de las secuencias "6 4 2" o "8 10 15" son V-Sequence ya que "6 4 2" no tiene ningún elemento en la parte creciente, mientras que "8 10 15" no tiene ningún elemento en la parte decreciente.
Se obtiene una subsecuencia de una secuencia eliminando cero o más elementos de la secuencia. Por ejemplo, la definición "7", "2 10", "8 2 7 6", "8 2 7 10 6", etc. son subsecuencias válidas de "8 2 7 10 6"
Dada una secuencia de N números encuentra su subsecuencia más larga que es una secuencia en V
Actualmente tengo una solución en la que I primero inicializar una matriz (m []) de modo que cada m [i] contiene las secuencias crecientes más largos a partir de 'i' dentro de la matriz O (n^2).
De manera similar, inicializo otra matriz (d []), de modo que cada d [i] contiene la secuencia decreciente más larga QUE TERMINA en ese punto.
Ambas operaciones toman O (n^2)
ahora voy a través de estas matrices y elegir el valor máximo de m [i] + d [i] -1, de manera que las condiciones requeridas son satisfechos.
Lo que quiero saber es: ¿Hay una solución O (n lg n)? Porque mi solución no se ejecuta dentro de los límites de tiempo requeridos. Gracias :)
CÓDIGO:
#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;
}
Es a partir de un concurso de programación que tuvo lugar anoche. Mi presentación superó los límites de tiempo para 6 de 11 casos de prueba. – arya