Cod sursa(job #1461387)

Utilizator petru.cehanCehan Petru petru.cehan Data 15 iulie 2015 16:42:01
Problema Parantezare optima de matrici Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin ("podm.in") ;
ofstream fout ("podm.out") ;

int DIM [ 502 ] , N ;

void Citire ()
{
    fin >> N ;
    for ( int i = 0 ; i <= N ; ++ i )
            fin >> DIM [i] ;
}

long long  a [501] [501] ; // matricea inmultirilor
void NrInmultiri ()
{
  for ( int i = 1 ; i <= N ; ++ i )
         a [i][i] = 0 ; // o matrice nu se inmulteste cu ea insasi // era data global oricum ..

 // for ( int i = 1 ; i <= N - 1  ; ++ i )
   //      a [i][i+1] = DIM [i-1] * DIM [i] * DIM [i+1] ;

  for ( int l = 1 ; l <= N - 1 ; ++ l )
    for ( int i = 1 ; i <= N - l ; ++ i )
      {
          int j = i + l ;
          a [i][j] = 1LL << 60  ;
          for ( int k = i ; k <= j - 1 ; ++ k )
          {
              int aux = a [i][k] + a [k+1][j] + DIM [i-1] * DIM [k] * DIM [j] ;
              if ( a[i][j] > aux )
                    a [i][j] = aux , a[j][i] = k ; // inchid paranteza dupa matricea A_k
          }

      }
  fout << a [1][N] ;
}

void parcurgere ( int linie , int coloana )
{
    int k = a [coloana][linie] ;
    if ( k != linie )
             parcurgere ( linie , k ) ;

    if ( k + 1 != coloana )
             parcurgere ( k + 1 , coloana ) ;

    cout << linie << " " << coloana << "\n";
}

int main()
{
    Citire () ;
    NrInmultiri () ;
    parcurgere ( 1 , N ) ;
    return 0;
}