Cod sursa(job #1323979)

Utilizator taigi100Cazacu Robert taigi100 Data 21 ianuarie 2015 17:51:06
Problema Parantezare optima de matrici Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
/*
	Keep It Simple!
*/

#include <fstream>

#define minV(a,b) ((a)<(b)?(a):(b))

using namespace std;

const int kMax_N = 505;
const int inf = 1 << 28;

long long d[kMax_N], dp[kMax_N][kMax_N];
int n;

void ReadData()
{
	ifstream fin("podm.in");
	fin >> n;
	for (int i = 0; i <= n; ++i)
		fin >> d[i];
	fin.close();
}

void PrintResult()
{
	ofstream fout("podm.out");
	fout << dp[1][n];
	fout.close();
}

void Initialize()
{
	for (int i = 1; i <= n; ++i)
	{
		for (int j = i; j <= n; ++j)
			dp[i][j] = inf;
		dp[i][i] = 0;
	}
}

void Solve()
{
	ReadData();
	Initialize();

	for (int i = 1; i < n; i++)
		dp[i][i + 1] = d[i - 1] * d[i] * d[i + 1];

	for (int diag = 2; diag < n; ++diag)
		for (int i = 1; i + diag <= n; ++i)
			for (int k = i; k < i + diag; ++k)
				dp[i][i + diag] = minV(dp[i][i + diag], dp[i][k] + dp[k + 1][i + diag] + d[i - 1] * d[k] * d[i + diag]);

	PrintResult();
}

int main()
{
	Solve();
	return 0;
}