14.01.2013 Views

Soluciones y Explicación de los problemas ACM ... - ICPC Bolivia

Soluciones y Explicación de los problemas ACM ... - ICPC Bolivia

Soluciones y Explicación de los problemas ACM ... - ICPC Bolivia

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Explicaciones a <strong>los</strong> <strong>problemas</strong> South American Regionals 2008 30<br />

Caso 1<br />

Don<strong>de</strong> k = 3 la primera ca<strong>de</strong>na es lovxxelyxxxxx y la segunda ca<strong>de</strong>na es xxxxxxxlovely, nos<br />

pi<strong>de</strong> la mayor subsecuencia que empiece por una segmento común <strong>de</strong> tamaño tres o mas, en<br />

este caso lov es el segmento que buscamos y la subsecuencia <strong>de</strong> este segmento es lovely que<br />

tiene una longitud <strong>de</strong> 6, notese que la subsecuencia común mas larga es xxxxxxx <strong>de</strong> longitud 7.<br />

Caso 2<br />

Don<strong>de</strong> k = 1 la primera ca<strong>de</strong>na es lovxxelyxxxxx y la segunda ca<strong>de</strong>na es xxxxxxxlovely,<br />

nos pi<strong>de</strong> la mayor subsecuencia común que empiece por una segmento común <strong>de</strong> tamaño uno<br />

o mas y esto es lo mismo que mostrarle la subsecuencia común mas larga que conocemos, esta<br />

es xxxxxxx que tiene una longitud <strong>de</strong> 7.<br />

Caso 3<br />

Don<strong>de</strong> k = 3 la primera ca<strong>de</strong>na es lovxxxelxyxxxx y la segunda ca<strong>de</strong>na es xxxlovelyxxxxxxx,<br />

el segmento común que buscamos <strong>de</strong> tamaño tres es lov la subsecuencia formada a partir <strong>de</strong><br />

este segmento es lovelyxxxx que tiene una longitud <strong>de</strong> 10, también existe otra en don<strong>de</strong> el<br />

segmento es xxx y la subsecuencia es xxxelyxxxx <strong>de</strong> igual longitud a la anterior.<br />

Caso 4<br />

Don<strong>de</strong> k = 4 la primera ca<strong>de</strong>na es lovxxxelyxxx y la segunda ca<strong>de</strong>na es xxxxxxlovely, en<br />

este caso no existe un segmento común que tenga el tamaño <strong>de</strong> cuatro o mas, a lo mas tiene<br />

un segmento común <strong>de</strong> tres.<br />

La solución en java que planteo es bastante similar al algoritmo anterior, pero en vez comparar<br />

un caracter con otro:<br />

if A[i] = B[j]<br />

C[i,j] := C[i-1,j-1] + 1<br />

la comparación es entre <strong>los</strong> k últimos caracteres, viendo que todos sean iguales para esto agrego<br />

un ciclo adicional en el cual veo si la solución parcial cumple con el requerimiento extra.<br />

Este problema se pue<strong>de</strong> consi<strong>de</strong>rar como <strong>de</strong> gran complejidad si uno no esta familiarizado con<br />

técnicas <strong>de</strong> programación dinámica.<br />

Programa Java que soluciona el problema<br />

import java.util.Scanner;<br />

import static java.lang.Math.max;<br />

class sequence {<br />

public static void main(String[] args) {<br />

Scanner in = new Scanner(System.in);

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!