Cod sursa(job #503132)

Utilizator crenguBacaoanu Crenguta crengu Data 21 noiembrie 2010 18:32:16
Problema Parantezare optima de matrici Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <iostream.h>
#include <fstream.h>
int d[100], c[100][100], n, op[100], cl[100];
ifstream f ("podm.in");
ofstream g("podm.out");
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;
				}
			}
		}
	g<<c[1][n];
}
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);
	return 0;
}