http://uva.onlinejudge.org/external/123/12385.html
Este problema se trata de dada una secuencia, encontrar una subsecuencia interesante, una subsecuencia interesante es una subsecuencia donde el primer elemento es igual al ultimo, y tu tarea es encontrar el maximo numero de subsecuencias de este tipo de tal manera que no se intersecten una con otra.
/* Autor: Rodrigo Burgos Dominguez */
#include "stdio.h"
#include "string.h"
#define MAXELEMENT 100000
int list[MAXELEMENT + 1];
int next[MAXELEMENT + 1];
int scanning[MAXELEMENT + 1];
int dp[ MAXELEMENT + 1];
int max( int a, int b){ return a > b ? a : b; }
main(){
int cases, ncases, n, x;
for( scanf("%d", &ncases), cases = 1; cases <= ncases ; cases++ ){
scanf("%d", &n);
for( x = 0; x < n; x++) scanf("%d", &list[ x ]);
/* se inicializa el barrido, para indicar que ningun elemento del mismo tipo a sido encontrado */
memset( scanning, -1, sizeof( scanning ));
for( x = n - 1; x >= 0 ; x--){
/* Se calcula el siguiente elemento igual a list[x] que encontro en el barrido ( scanning) */
next[ x ] = scanning[ list[ x ] ];
/* Se incerta al barrido que el elemento list[x] se encontro en la posicion x */
scanning[ list[x] ] = x;
}
memset( dp, 0, sizeof( dp ));
for( x = 0; x < n; x++){
/* Si en la posicion x existe algun elemento igual a el pero despues de el, se puede incrementar
el numero de subsecuencias */
if( next[x] != -1) dp[ next[x] ] = max( dp[ next[ x ]] , dp[ x ] + 1 );
/* En dado caso de no encontrar ningua se asigna a la siguiente posicion el mejor valor obtenido*/
dp[ x + 1] = max( dp[ x + 1], dp[ x ] );
}
printf("%d\n", dp[ n ]);
}
return 0;
}
No hay comentarios:
Publicar un comentario