Cod sursa(job #2910749)

Utilizator mircea_007Mircea Rebengiuc mircea_007 Data 24 iunie 2022 21:18:14
Problema Parantezare optima de matrici Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
// This program was written by Mircea Rebengiuc
// on 22.06.2022
// for problem podm

#include <stdio.h>
#include <ctype.h>

#define MAXN 500
#define UNDEFINED -1
#define ll long long

int lat[MAXN + 1];
ll dp[MAXN][MAXN];

void init_dp( int n ){
  int i, j;

  for( i = 0 ; i < n ; i++ )
    for( j = 0 ; j < n ; j++ )
      dp[i][j] = UNDEFINED;

  for( i = 0 ; i < n ; i++ )
    dp[i][i] = 0;
}

static inline ll min( ll a, ll b ){ return a < b ? a : b; }

ll getDP( int l, int r ){// big brain memoizare
  int mij;
  ll retval = 5e14;

  if( dp[l][r] != UNDEFINED )
    return dp[l][r];

  for( mij = l ; mij < r ; mij++ )
    retval = min( retval,
      getDP( l, mij ) +
      getDP( mij + 1, r ) +
      ((long long)lat[l]) * lat[mij + 1] * lat[r + 1]
    );
  
  return (dp[l][r] = retval);
}

FILE *fin, *fout;

int main(){
  fin = fopen( "podm.in", "r" );
  fout = fopen( "podm.out", "w" );

  int n, i;

  fscanf( fin, "%d", &n );
  for( i = 0 ; i <= n ; i++ )
    fscanf( fin, "%d", lat + i );

  init_dp( n );

  fprintf( fout, "%lld\n", getDP( 0, n - 1 ) );


  fclose( fin );
  fclose( fout );
  return 0;
}