100 likes | 596 Views
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
E N D
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
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<<" "; for (i=0; i<n; i++) cout<<setw(5)<<i; cout<<endl<<endl; for (i=0; i<n; i++) { cout<<"i="<<i<<" "; for (j=0; j<n; j++) 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