Editorial for Descubriendo ADN


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Author: eblabrada

Te explico mi solución con DP. Definamos a dp(i,inv) como la mínima cantidad de movimientos que necesitamos para que el prefijo hasta la posición i sea AAA..AA, inv sólo va tomar dos valores 0 si estamos analizando la cadena original, y 1 si estamos analizando la cadena original invertida (o sea, todas las A se transforman en B y viceversa, por ejemplo, la cadena invertida de ABBA es BAAB).


  1. Podemos ver fácilmente que si no tenemos a ningún caracter en el prefijo entonces no es necesario hacer ningún movimiento por tanto: \displaystyle dp(0,0) = 0, dp(0,1) = 0
  2. Si estamos evaluando la cadena original y el caracter que evaluamos es una A entonces no necesitamos hacer ningún movimiento extra, por lo que la cantidad de movimientos que tenemos que hacer para que el prefijo hasta i sea AAA..AA es la misma cantidad de movimientos para que el prefijo i-1 sea AAA..A, por lo que en este caso \displaystyle dp(i,0) = dp(i-1,0)
  3. Si estamos evaluando la cadena invertida y el caracter en la posición i de la cadena original es A significa que estamos evaluando el caracter B en la cadena invertida, entonces hay dos movimientos posibles: (1) cambiar un caracter, aquí la solución sería la misma cantidad de movimientos que teníamos para que el prefijo i-1 sea AAA..A en la cadena invertida más el movimiento extra de cambiar la B por la A; (2) invertir el prefijo donde la solución sería la misma cantidad de movimientos que teníamos en el prefijo i-1 en la cadena original más el movimiento extra de invertir el prefijo i, como queremos quedarnos con la mínima cantidad de movimientos nos quedaremos con el mínimo de estos dos casos: \displaystyle dp(i,1) = min(dp(i-1,0),dp(i-1,1))+1
  4. Si estamos evaluando la cadena original y el caracter en la posición i es B hacemos un análisis similar al del caso 3 y nos queda que: \displaystyle dp(i,0) = min(dp(i-1,0),dp(i-1,1))+1
  5. Si estamos evaluando la cadena invertida y el caracter en la posición i de la cadena original es B significa que en la cadena invertida estamos evaluando el caracter A, realizando un análisis similar al del caso 2 nos queda que: \displaystyle dp(i,1) = dp(i-1,1)

La solución nos queda en dp(N,0). Esto tiene una complejidad O(N) en tiempo y memoria. Se pueden hacer optimizaciones en memoria para que quede O(1) pero no es necesario en este problema.


Comments

There are no comments at the moment.