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

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 />

}

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

Saved successfully!

Ooh no, something went wrong!