Cod sursa(job #1703890)

Utilizator TincaMateiTinca Matei TincaMatei Data 17 mai 2016 19:06:25
Problema Parantezare optima de matrici Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.11 kb
#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( "pdm.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;
      for( k = i ; k < j ; k++ ) {
        inmultiri = ( long long )matr[ i ][ k ] + matr[ k + 1 ][ j ] +
                    (long long)d[ i ] * d[ j + 1 ] * d[ k + 1 ];
        if( inmultiri < matr[ i ][ j ] )
          matr[ i ][ j ] = inmultiri;
      }
    }
  FILE *fout = fopen( "pdm.out" , "w" );
  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

*/