matrices.cpp
//__INSERT_LICENSE__
// $Id$
/*
COMIENZO DE DESCRIPCION
Multiplicar cuatro matrices de n\'umeros reales
{\tt M1 M2 M3 M4}, donde {\tt M1} tiene
10 filas y 20 columnas, {\tt M2} es de 20 por 50, {\tt M3}
es de 50 por 1 y {\tt M4} es de 1 por 100. Asuma que la
multiplicaci\'on de una matriz {\tt A (p,q)} por otra
{\tt B (q,r)} requiere {\tt z = p q r} operaciones
escalares (que es el n\'umero de operaciones requerido por el
algoritmo de multiplicaci\'on de matrices). Encuentre
un orden \'optimo en que se deben multiplicar las
matrices para minimizar el n\'umero total de operaciones
escalares. Como podria encontrarlo si hay una
cantidad arbitraria de matrices de dimension arbitraria ?
keywords: algoritmos
FIN DE DESCRIPCION
*/
// -----------------------------------------------------------------
// Ejemplo: al correr ingresar los siguientes datos correspondientes
// al ejercicio de la Guia
// 5
// 10 20 50 1 100
// -----------------------------------------------------------------
#include <iostream>
#include <limits.h>
#include <stdlib.h>
#include <list>
#include <queue>
using namespace std;
// -----------------------------------------------------------------
typedef list<int> list_e;
typedef queue<int> cola_e;
// -----------------------------------------------------------------
int orden_mul_mat(list_e &indices,cola_e &orden) {
list_e::iterator p1,p2,p3; // indices de los tripletes
list_e::iterator q,z; // indice central
int costo_min,costo_pan,costo_acu;
// inicializa iteradores
p1=indices.begin();
p2=p1; p2++;
p3=p2; p3++;
// inicializa costo total acumulado
costo_acu=0;
// recorre la lista de indices remanente
z=indices.end();
while (p3!=z) {
costo_min=LONG_MAX; // maximo entero representable
// busca menor producto de tripletes
cout << " " << endl;
cout << "revisa lista remanente" << endl;
while (p3!=z) {
costo_pan=(*p1)*(*p2)*(*p3);
cout << "costo del producto analizado = " << costo_pan << endl;
if (costo_pan<costo_min) {
costo_min=costo_pan; // recuerda minimo producto
q=p2; // recuerda posicion central
}
p1++; p2++; p3++; // avanza al siguiente triplete
}
// acumula al total de operaciones
costo_acu += costo_min;
cout << "costo minimo = " << costo_min << endl;
cout << "costo acumulado = " << costo_acu << endl;
orden.push(*q); // poner indice contraido en la cola
indices.erase(q); // saca indice contraido de la lista
// reinicializa los iteradores de los tripletes al
// primer, segundo y tercer elemento de la
// lista de indices remanentes
z=indices.end();
p1=indices.begin();
p2=p1; p2++;
p3=p2; p3++;
}
indices.clear();
return costo_acu;
}
// -----------------------------------------------------------------
int main() {
list_e indices;
cola_e orden;
int n,i,costo_min;
// lectura datos
cout << endl;
cout << "numero de indices: ? "; cin >> n;
cout << "lista de indices (no repetidos) : ? ";
for (int j=0;j<n;j++) {
cin >> i;
indices.push_back(i);
}
// calcula
cout << endl;
cout << "computando ... " << endl;
costo_min=orden_mul_mat(indices,orden);
// impresion resultados
cout << endl;
cout << "orden en la multiplicacion: ";
while (!orden.empty()) {
cout << orden.front() << " ";
orden.pop( );
}
cout << endl;
cout << "costo minimo = " << costo_min << endl;
cout << " " << endl;
return 0;
}
// -----------------------------------------------------------------
Generated by GNU Enscript 1.6.6.