Pagini recente » Cod sursa (job #39148) | Cod sursa (job #369306) | Cod sursa (job #2974767) | Cod sursa (job #2087830) | Cod sursa (job #1703877)
#include <stdio.h>
#define MAX_N 500
#define INFINIT 10000000000000000LL
int d[ MAX_N + 1 ];
long long matr[ MAX_N ][ MAX_N ];
int main() {
int n , i , j , k , kMin;
long long inmultiri;
FILE *fin = fopen( "podm.in" , "r" );
fscanf( fin , "%d" , &n );
for( i = 0 ; i < n + 1 ; i++ )
fscanf( fin , "%d" , &d[ i ] );
fclose( fin );
//ne calculam tabelul folosind recurenta
for( j = 1 ; j < n ; j++ )
for( i = j - 1 ; i >= 0 ; i-- ) {
matr[ i ][ j ] = INFINIT;
kMin = INFINIT;
for( k = i ; k < j ; k++ ) {
inmultiri = ( long long )matr[ i ][ k ] + matr[ k + 1 ][ j ] +
d[ i ] * d[ j + 1 ] * d[ k + 1 ];
if( inmultiri < matr[ i ][ j ] ) {
matr[ i ][ j ] = inmultiri;
kMin = k;
} else if( inmultiri == matr[ i ][ j ] )
kMin = k;
}
}
FILE *fout = fopen( "podm.out" , "w" );
//reconstruim tabelul
fprintf( fout , "%lld\n" , matr[ 0 ][ n - 1 ] );
fclose( fout );
return 0;
}
/*
matr[i][j] = numarul minim de inmultiri scalare folosind matricile i...j
cut[i][j] = k astfel incat matr[i][k] + matr[k+1][j] + d[i]*d[j+1]*d[k+1] sa fie optim
matr[ i ][ j ] = min( matr[i][k] + matr[k+1][j] + d[i]*d[j+1]*d[k+1] ) k=i...j-1
*/