Pagini recente » Cod sursa (job #1581207) | Cod sursa (job #1889691) | Cod sursa (job #826466) | Cod sursa (job #32538) | Cod sursa (job #405669)
Cod sursa(job #405669)
/*
@ Mihai Tabara, 2010
Method: Recursion + memoisation
O(n^3) - time
O(N^2) - memory
90 - Works slower than PD - because it needs to compute every subproblem
*/
#include <fstream>
#include <climits>
#include <cstdlib>
using namespace std;
const char* in = "podm.in";
const char* out = "podm.out";
const int NMAX = 505;
const long long INF = LLONG_MAX;
long long Mat ( int i, int j, long long*** ref, long long** P )
{
long long Q;
int k;
if ( (*ref)[i][j] < INF )
return (*ref)[i][j];
if ( i == j )
(*ref)[i][j] = 0;
else
{
for ( k = i; k <= j-1; ++k )
{
Q = Mat ( i, k, ref, P ) + Mat ( k+1, j, ref, P ) + (*P)[i-1] * (*P)[k] * (*P)[j];
if ( Q < (*ref)[i][j] )
(*ref)[i][j] = Q;
}
}
return (*ref)[i][j];
}
int main ( void )
{
freopen ( in, "r", stdin );
freopen ( out, "w", stdout );
int N;
scanf ( "%d", &N );
int i, j;
long long ** M;
long long * P;
M = new ( nothrow ) long long* [ NMAX ];
if ( M == 0 ) { printf ( "Error. Bad allocation Memory !\n" ); exit(0); }
for ( i = 0; i < NMAX; ++i )
{
M[i] = new ( nothrow ) long long [ NMAX ];
if ( M[i] == 0 ) { printf ( "Error. Bad allocation Memory !\n" ); exit(0); }
}
P = new ( nothrow ) long long [ NMAX ];
if ( P == 0 ) { printf ( "Error. Bad allocation Memory !\n" ); exit(0); }
for ( i = 0; i <= N; scanf ( "%lld", P+i++ ) );
for ( i = 1; i <= N; ++i )
for ( j = 1; j <= N; ++j )
*(*(M+i)+j) = INF;
printf ( "%lld\n", Mat( 1, N, &M, &P ) );
delete [] P;
for ( i = 0; i < NMAX; ++i )
delete [] M[i];
delete [] M;
return 0;
}