Cod sursa(job #443110)

Utilizator alinatomaToma Alina alinatoma Data 16 aprilie 2010 01:38:22
Problema Parantezare optima de matrici Scor 80
Compilator c Status done
Runda Arhiva educationala Marime 2.4 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define FOR(i, a, b)  for (i = (a); i <= (b); ++ i)
#define INF   100000000


/*
void afisare(int i, int j)
{
if (i==j)
	printf("M%i",i);
	else
		{
		printf("(");
		afisare(i, M[i][j]);
		printf(")*(");
		afisare(M[i][j]+1, j);
		printf(")");
		}
}

*/
int main(){

FILE* f;
FILE* g;
int n, i, j, h, k, min, kmin, w;
int** M;
int* d;
min = 0;
kmin = 0;
j=0;

f= fopen("podm.in","r");
fscanf(f, "%i\n", &n);


d = (int*)calloc((n+1),sizeof(int*));
M = (int**)calloc((n+1),sizeof(int*));


for(i=0;i<n+1;i++)
	{
	
	M[i] = (int*)calloc(n+1,sizeof(int));
	
	fscanf(f, "%i ", &d[i]);
	}


    FOR (i, 1, n - 1)  M[i][i + 1] = d[i - 1] * d[i] * d[i + 1];
    FOR (w, 2, n - 1) FOR (i, 1, n - w) {
        int j = i + w;
        M[i][j] = INF;
        FOR (k, i, j - 1)
            M[i][j] = Min(M[i][j], M[i][k] + M[k + 1][j] + d[i - 1] * d[k] * d[j]);
    }
    
printf("Numarul minim de inmultiri este %i\n", M[1][n]);

for(i=0;i<n+1;i++)
	{
	for (j=0;j<n+1;j++)
		printf("%i ",M[i][j]);
		if (M[i][j]>0) M[i][j]=1;
	printf("\n");
	}
		
//afisare (M[][n], 0,n);
g= fopen ("podm.out", "w");
fprintf(g, "%i",M[1][n]);
fclose(f);
fclose(g);

return 0;	
}


/*
program InmultireOptimalaMatrici;
const NMaxMatrici = 50;
      infinit = 1000000000;
type  IndiceMatrice = 1 .. NMaxMatrici;
var n,i,j,h,k,kmin: Indicematrice;
    d: array[Indicematrice] of longint;
    min: longint;
    m: array[IndiceMatrice, IndiceMatrice] of longint;

procedure Citire;
var fin: text;
    i: IndiceMatrice;
begin
assign (fin, 'mat.in'); reset (fin);
readln (fin, n);
for i := 1 to n + 1 do read (fin, d[i]);
readln (fin);
close (fin);
end;

procedure Afisare (i, j: IndiceMatrice);
begin
if i = j then write ('A', i)
   else
   begin
   write('(');
   Afisare (i, M[j,i]);
   write (')*(');
   Afisare (M[j,i]+1,j);
   write(')');
   end;
end;

begin
Citire;
for h := 1 to n -1 do
    for i := 1 to n - 1 do
        begin
        j := i + h;
        min := infinit;
        for k := i to j - 1 do
            if min > M[i, k] + M[k+1, j] + d[i] * d[k+1] * d[j+1] then
               begin
               min := M[i, k] + M[k+1, j] + d[i] * d[k+1] * d[j+1];
               kmin := k;
               end;
        M[i, j] := min;
        M[j,i] := kmin;
        end;
writeln ('Numarul minim de inmultiri este ', M[1,n]);
writeln ('Solutia optima este:' );
Afisare (1,n);
writeln;
end.
*/