Cod sursa(job #1094460)

Utilizator casuneanu.andreiCasuneanu Andrei Dan casuneanu.andrei Data 29 ianuarie 2014 14:15:41
Problema Parantezare optima de matrici Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
//
//  main.cpp
//  inmultirea_optimala_a_matricilor
//
//  Created by Casuneanu Andrei on 29/01/14.
//  Copyright (c) 2014 Casuneanu Andrei. All rights reserved.
//

#include <fstream>
#define DMAX 508
#define IN "podm.in"
#define OUT "podm.out"
#define INFINIT 1000000000000000ll
using namespace std;

ifstream fin(IN);
ofstream fout(OUT);

int n;
long long int d[DMAX];
long long int nrmin[DMAX][DMAX];

void citire();
void showtime();
void afisare();

int main(int argc, const char * argv[])
{
	citire();
	showtime();
	afisare();
    return 0;
}

void afisare()
{
	fout <<nrmin[1][n]<<'\n';
	fout.close();
}

void showtime()
{
	//initializare
	//doua matrici
	int i, j;
	for (i=1; i<n; i++) nrmin[i][i+1]=d[i-1]*d[i]*d[i+1];
	
	//calculez pentru x matrici de la 3 la n
	
	int x, k;
	long long int minim, kmin;
	for (x=3; x<=n; x++)
		for (i=1; i<=n-x+1; i++)
		{
			//x matrici incepand de la pozitia i, Ai...Ai+x-1
			j=i+x-1;
			minim=INFINIT;
			for (k=i; k<j; k++)
				if (minim>nrmin[i][k]+nrmin[k+1][k]+d[i-1]*d[k]*d[j]) {minim=nrmin[i][k]+nrmin[k+1][j]+d[i-1]*d[k]*d[j]; kmin=k;}
			nrmin[i][j]=minim; nrmin[j][i]=kmin;
		}
}

void citire()
{
	fin >>n;
	
	int i;
	for (i=0; i<=n; i++) fin >>d[i];
}