Cod sursa(job #1264396)

Utilizator gerd13David Gergely gerd13 Data 15 noiembrie 2014 19:34:07
Problema Parantezare optima de matrici Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <algorithm>
#include <fstream>
#include <iostream>
#include <string>
#include <cstring>
#define  INF  100000000000000000LL


using namespace std ;

const int NMAX = 505 ;


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

int C[29][29], N, M[NMAX][NMAX];
string sir ;
int S[NMAX] ;


static inline int min(int a, int b) {return (a > b ? b : a) ;}

int main()
{
    fin >> N ;
    fin >> sir ;
    for(int i = 1 ; i <=  26; ++ i)
        for(int j = 1 ; j <= 26 ; ++ j)
            fin >> C[i][j] ;

   for(int i = 0 ; i < N; i ++)
        S[i + 1] = sir[i] - 'a' + 1;



    for(int t =  1 ; t < N ; t ++)
        for(int  i = 1 ; i <= N - t; i ++)
    {
        int j = i + t ;
        //cout << C[S[i]][S[j]] << ' ' ;
        if(i  + 1 == j) M[i][j] = C[S[i]][S[j]];
        else {
            M[i][j] = INF ;
            for(int k = i  + 1 ; k <= j ; k ++)
                if( (k - i - 1) % 2 == 0 && ( j - k ) % 2 == 0)
                if( M[ i ][ j ] > M[ i + 1 ][ k - 1 ] + M[ k + 1 ][ j ] + C[ S[ i ] ][ S[ k ] ])
                    M[ i ][ j ] = M[ i + 1 ][ k - 1 ] + M[ k + 1 ][ j ] + C[ S[ i ] ][ S[ k ] ] ;

        }


    }



    fout << M[1][N]  << '\n';


    fin.close() ;
    fout.close() ;
    return  0 ;
}