Cod sursa(job #1035394)

Utilizator andr3yon3Ichim Andrei andr3yon3 Data 18 noiembrie 2013 15:33:59
Problema Parantezare optima de matrici Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>

using namespace std;

int d[100], c[100][100], n, op[100], cl[100];
ifstream f("matrice.in");
void citire ()
{
	int i;
	f>>n;
	for (i=0;i<=n;i++) f>>d[i];
	f.close();
}
int min (int a, int b) {
	return (a<b)?a:b;
}
void matrice () {
	int i,p,aux,k,j,t,t1;
	for (i=1;i<=n;i++) c[i][i]=0;
	for (i=1;i<=n-1;i++) c[i][i+1]=d[i-1]*d[i]*d[i+1];
	for (p=2;p<=n-1;p++)
		for (i=1;i<=n-p;i++)
		{
			j=i+p;
			c[i][j]=c[i][i]+c[i+1][j]+d[i-1]*d[i]*d[j];
			c[j][i]=i;
			for (k=i+1;k<=j-1;k++)
			{
				aux=c[i][k]+c[k+1][j]+d[i-1]*d[k]*d[j];
				if (c[i][j]>aux) {
					c[i][j]=aux;
					c[j][i]=k;
				}
			}

		}
	cout<<c[1][n];
	cout<<endl;
}
int parantezare (int i, int j, int op[], int cl[])
{
	if (j-i>1) {
		int k=c[j][i];
		if (i!=k) {
			op[i]++; cl[k]++;
		}
		if (k+1!=j) {
			op[k+1]++;
			cl[j]++;
		}
		parantezare (i,k,op,cl);
		parantezare (k+1,j,op,cl);
	}
}
int main()
{
	int i,j;
	citire ();
	matrice ();
	parantezare (1,n,op,cl);
	for (i=1;i<=n;i++){
		for (j=1;j<=op[i];j++) cout<<"(";
		cout<<"A"<<i;
		for (j=1;j<=cl[i];j++) cout<<")";
	}
	return 0;
}