Cod sursa(job #1461404)

Utilizator petru.cehanCehan Petru petru.cehan Data 15 iulie 2015 17:03:09
Problema Parantezare optima de matrici Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>

using namespace std;

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

long long DIM [ 502 ] , N ;

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

long long  a [502] [502] ; // 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] = 100000000000000000LL ;
          for ( int k = i ; k < j  ; ++ k )
          {
              long long 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 )
{
    long long 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;
}