Pagini recente » Cod sursa (job #1172691) | Cod sursa (job #794145) | Cod sursa (job #1776629) | Cod sursa (job #1592414) | Cod sursa (job #1264396)
#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 ;
}