El Problema de las Vacas Cesar Liza Avila
Enunciado Se tienen 2 vacas que deben alimentarse. Se coloca bloques de pasto en fila para alimentarlas. Las vacas solo pueden comer el pasto que se encuentra en uno de sus extremos La primera de ellas, una vaca inteligente desea aplicar una estrategia que le permita comer mas pasto. La segunda come el bloque de pasto mas grande que se encuentra en uno de los extremos. Implemente la estrategia de la 1ra vaca. . . . César Liza Avila
La vaca 1, tiene dos alternativas Sea Tabla(i, j) la cantidad de pasto que puede comer la vaca 1 cuando empieza a comer con bloques entre i hasta j. i, i+1, i+2, . …..…, j-2, j-1, j La vaca 1, tiene dos alternativas 1) Come pi y luego come lo que pueda comer entre lo que queda Pero que le queda? Pues si pi+1>pj, la vaca 2 come pi+1, dejando tabla(i,j) = pi + tabla(i+2, j) i, i+1, i+2, . … . . …… , j-2, j-1, j Pero si pi+1<pj, la vaca 2 come pj, dejando: tabla(i,j) = pi + tabla(i+1, j-1) i, i+1, i+2, . … . . …… , j-2, j-1, j César Liza Avila
2) Come pj y luego come lo que pueda comer entre lo que queda Pero que le queda? Pues si pi>pj-1, la vaca 2 come pi, dejando tabla(i,j) = pj + tabla(i+1, j-1) i, i+1, i+2, . … . . …… , j-2, j-1 j Pero si pi<pj-1, la vaca 2 come pj-1, dejando: tabla(i,j) = pj + tabla(i, j-2) i, i+1, i+2, . … . . …… , j-2, j-1 j César Liza Avila
, Condición Base: Si n=2 bloques tabla(i, i+1) = max(pi, pi+1) Si pi>pj-1 pj + tabla(i+1, j-1) Si pi+1>pj pi + tabla(i+2, j) tabla(i,j) = max Si pi+1<pj pi + tabla(i+1, j-1) Si pi>pj-1 pj + tabla(i, j-2) , César Liza Avila
void llenaTabla(int n, int tabla[ ][MAX]) { int i,j; for (i=0; i<n; i++) for (j=0; j<n; j++) tabla[i][j] = 0; } void impTabla(int tabla[][MAX], int n) { int i, j; cout<<" "; cout<<setw(5)<<i; cout<<endl<<endl; { cout<<"i="<<i<<" "; cout<<setw(5)<<tabla[i][j]; cout<<endl; # include <iostream.h> # include <iomanip.h> #define MAX 100 #define max(a,b) ((a)>(b))?(a):(b) int vacas(int P[], int n); void llenaTabla(int n, int tabla[][MAX]); void impTabla(int tabla[][MAX], int n); void main(void) { int P[ ]={2, 2, 1, 5, 3, 8, 7, 3} ; cout<<"Si la 1ra vaca es inteligente come:“ <<vacas(P, 8)<<endl; } César Liza Avila
int vacas(int P[ ], int n) { int i; int pi, pj; int tabla[MAX][MAX]; llenaTabla(n, tabla); // no es necesario for(i = 0;i< n-1; i++) tabla[i][i+1]= max (P[i], P[i+1]); for(int d=3; d<n; d=d+2) for(int i=0; i<n-d; i++) { int j=i+d; if( P[j]> P[i+1]) pi = tabla[i+1][j-1]; else pi = tabla[i+2][j]; if (P[i]< P[j+1]) pj = tabla[i][j-2]; else pj = tabla[i+1][j-1]; tabla[i][j] = max (P[i] + pi, P[j] + pj); } impTabla(tabla, n); // no es necesario return tabla[0][n-1]; César Liza Avila
Vaca 1: 3 + 8 + 5 + 2 = 18 Vaca 2: 7 + 3 + 2 +1 = 13 César Liza Avila
PD: Este problema es similar 3379-Two Ends. http://acmicpc-live-archive.uva.es/nuevoportal/ Los movimientos de la vaca que usa la estratagia de tomar el mayor de los extremos debe ser llenado en las diagonales que estan vacias. César Liza Avila