Cod sursa(job #1180447)

Utilizator vlasinalinVlasin Alin vlasinalin Data 30 aprilie 2014 17:55:37
Problema Parantezare optima de matrici Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <fstream>
using namespace std;

#define in "podm.in"
#define out "podm.out"

#define MAXN 501

int n, arr[MAXN], best[MAXN][MAXN];

int min(int a, int b)
{
	return a < b ? a : b;
}

void read_input()
{
	ifstream fin(in);

	fin >> n;
	n++;

	for (int i = 0; i < n; ++i)
	{
		fin >> arr[i];
		//cout << arr[i] << ' ';
	}
	//cout << '\n';
	fin.close();
}


void print_debug()
{
	cout << '\n';
	for (int i = 1; i <= n; i++)
	{
		cout << '\n';
		for (int j = 1; j <= n; j++)
		{
			cout << best[i][j] << ' ';
		}
	}
}

void print_solution()
{
	ofstream fout(out);
	fout << best[1][n-1];
	fout.close();
}

int compute_val(int i, int k, int j)
{
	return best[i][k] + best[k + 1][j] + (arr[i - 1] * arr[k] * arr[j]);
}

int compute_best(int i, int j)
{
	int min = (1 << 30);
	int cval;
	for (int k = i; k < j; ++k)
	{
		cval = compute_val(i, k, j);
		if (cval < min)
		{
			min = cval;
		}
	}
	return min;
}

void resolve()
{
	for (int i = 1; i < (n - 1); ++i)
	{
		for (int j = 1; j < (n - i); ++j)
		{
			best[j][j + i] = compute_best(j, j + i);
		}
	}
}

int main()
{
	read_input();

	resolve();

	//print_debug();

	print_solution();

	//char x;
	//cin >> x;

	return 0;
}