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
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Explicaciones a <strong>los</strong> <strong>problemas</strong> South American Regionals 2008 23<br />
Análisis <strong>de</strong>l Problema E<br />
Es posible ver que es el mismo problema para cada una <strong>de</strong> las filas, que si se tomaran todas las<br />
filas a la vez. Ya que al elegir una fila, <strong>de</strong>scartamos sus filas adyacentes.<br />
Si tomamos la tercera fila <strong>de</strong>l ejemplo, <strong>de</strong>scartamos la segunda y la cuarta fila.<br />
Ya hemos reducido el problema a buscar la solución para una sola fila.<br />
Cuando escogemos una celda <strong>de</strong> la fila no es posible elegir ninguna <strong>de</strong> sus celdas adyacentes.<br />
Si tenemos nuestra fila <strong>de</strong> dulces en un vector D[] entonces la cantidad máxima que po<strong>de</strong>mos<br />
escoger esD[actual] + D[actual - 2] pero solo para la posición actual <strong>de</strong> la celda, y <strong>de</strong>bemos<br />
recorrer toda la fila para ver cual es la cantidad máxima a escoger.<br />
Para resolver el problema utilizaremos Programación Dinámica.<br />
En el vector D[] se tiene una secuencia <strong>de</strong> enteros E : e1, e2, e3 . . .en, <strong>de</strong> don<strong>de</strong> <strong>de</strong>seamos buscar<br />
la respuesta para la subsecuencia e1 . . .ek, esto nos lleva a una recursión que toma la siguiente<br />
forma D[k] = max(D[k - 1], D[k] + D[k - 2]), poniéndolo en palabras es guardar en la<br />
posición actual el valor máximo entre un valor ya calculado (D[k - 1]) y el calculado para la<br />
posición actual (D[k] + D[k - 2]), con esto obtenemos el valor máximo que pue<strong>de</strong> darnos a<br />
elegir la fila, sin saber que valores han sido elegidos ya que estos no son requeridos, una vez<br />
calculado para una fila <strong>de</strong>bemos realizar esta tarea para todas las filas restantes.<br />
Analicemos el primer caso en don<strong>de</strong> M = 5 y N = 5;<br />
Para no tener <strong>problemas</strong> con k - 1 o k - 2 cuando k < 1 o k < 2 simplemente añadimos dos<br />
celdas vacías al inicio y cuando se consulte la cantidad enk - 1 o k - 2 esta sea 0, como vemos<br />
en el siguiente ejemplo, don<strong>de</strong> D[][] es nuestra matriz que guarda las cantida<strong>de</strong>s <strong>de</strong> dulces y<br />
al mismo tiempo nuestra matriz <strong>de</strong> programación dinámica.<br />
int[][] D = new int[M][N+2];<br />
for (int i = 0; i < M; i++) {<br />
for (int j = 0; j < N; j++) {<br />
D[i][j+2] = in.nextInt();<br />
}<br />
}