/* * Pierre Hyvernat, exemple de programme pour le TP1 du cours info803. C'est * presque une correction... * * On cherche le parenthésage minimisant le nombre de multiplications * scalaires pour le calcul du produit d'une chaîne de matrices... * (exemple typique de progrqmmqtion dynamique) */ #include #include /* variables globales : * - n est le nombre de matrices à multiplier * - T est le tableau des tailles des matrices * - M est le tableau qui contient le nombre optimal de multiplications pour * multiplier des sous-chaînes * - P est le tableau qui contient les indices des endroits où il faut * couper pour multiplier des sous-chaînes * * Pour gagner de la place (?); on pourrait en fait utiliser un seul tableau * au lieu de M et P : on utiliserait la partie au dessus de la diagonale pour * M et la partie au dessous de la diagonale pour P... */ int n, *T, **M, **P; /* * fonction d'affichage du parenthésage contenu dans le tableau P. * le booléen b sert à omettre les parenthéses externes... */ void affiche(int i, int j, int b) { int k ; if (i==j) printf("M") ; else { k = P[i][j] - 1 ; if (b) printf("(") ; affiche(i, k, 1) ; printf(" x "); affiche(k+1,j, 1); if (b) printf(")") ; } } /* * la fonction principale, qui fait tout... */ int main () { int i,j,k,tmp,N,d,t ; /* lecture du tableau des tailles */ printf("Combien de matrices voulez-vous multiplier ? "); if (scanf("%i",&n)!=1) { printf("??? Il fallait me donner un entier...\n") ; return(-1) ;} T = malloc ((n+1)*sizeof(int)) ; printf("Quelles sont les tailles des matrices ?\n"); for(i=0;i<=n;i++) { printf("t(%i) = ? ",i) ; if (scanf("%i",T+i)!=1) { printf("??? Il fallait me donner un entier...\n") ; return(-1) ;} } printf("\n\nOn veut multiplier des matrices de tailles :\n") ; for(i=0;i