[ hamburg @ 11.01.2006. 22:08 ] @
prvi put sam ovdje,ali se ipak nadam da ce mi neko pomoci! imam problem sa kodom ,koji cu u cjelosti navesti. mislila sam da mi neko od vas samo objasni na koji nacin se biraju vrijednosti matrice A i na koji nacin radi funkcija koja stampa redosljed mnozenja matrica! znaci: POTREBNO MI JE SAMO OBJASNJENJE RADA FUNKCIJE STAMPA i na koji nacin se dobijaju elementi matrice a... zao mi je sto vas mucim,ali stvarno mi je hitno!!! evo teksta zadatka: /* Date su matrice M1, M2, ..., Mn cije su dimenzije redom D0xD1, D1xD2, ..., Dn-1xDn. U proizvodu M1xM2x ... xMn moguce je postaviti zagrade na razlicite nacine, a rezultujuca matrica ne zavisi od rasporeda zagrada. Za dati niz D0, D1 ..., Dn odrediti raspored zagrada tako da broj mnozenja potrebnih za izracunavanje proizvoda M1xM2x ... xMn bude minimalan. Broj mnozenja u proizvodu M1xM2 iznosi D0xD1xD2. Stampati miminalan broj mnozenja i kako se on realizuje.*/ /* Rjesenje: Dinamicko programiranje Neka b[j] oznacava minimalnu cijenu mnozenja matrica Mi x...X Mj. Tada je: b[j] = min(b[k]+b[k+1][j]+dxd[k]xd[j]), i<=k<j i b[j] = 0, ako je i=j. Brojeve racunamo prvo za i=j, pa za i-j = 1, itd. a evo i koda: #include <stdio.h> #define DIM 30 int a[DIM+1][DIM+1], b[DIM+1][DIM+1], d[DIM+1]; /***************************************************************************/ void Unos_Niza(int *n, int *x) { /*Unos_Niza*/ int i ; printf("Unesite broj elemenata niza(broj matrica koje se mnoze):"); scanf("%d", n); printf("Unesite elemente niza (dimenzije matrica):"); for(i=0;i <= *n;i++) scanf("%d", &x); } /**************************************************************************/ void Stampa(int p, int q) /* Rekurzivno stampanje redosleda stampanja matrica.*/ { if (q == p) printf("%s%d", "M",q); else { printf("("); Stampa(p,a[p][q]); printf(")x("); Stampa(a[p][q]+1,q); printf(")"); } } /**************************************************************************/ void PopuniMatrice(int n) { int i,j,k,l; for (i=0;i<n;i++) for (j=0;j<n;j++) b[j]=0; for (l=1; l <= n-1; l++) /* l predstavlja razliku i-j */ for (i=0;i<n-1;i++) { j = i+l; b[j] = b + b[i+1][j] + d*d[i+1]*d[j+1]; a[j] = i; for (k= i+1; k<= j-1;k++) if (b[j] > b[k]+b[k+1][j]+d*d[k+1]*d[j+1]) { b[j] = b[k]+b[k+1][j]+d*d[k+1]*d[j+1]; a[j] = k; } } } /**************************************************************************/ main() { int n; Unos_Niza(&n,d); PopuniMatrice(n); printf("Minimalan broj mnozenja je:%d\n", b[0][n-1]); Stampa(0,n-1); putchar('\n'); } |