Cod sursa(job #813268)

Utilizator teonasipoteanuTeona Sipoteanu teonasipoteanu Data 15 noiembrie 2012 08:34:21
Problema Parantezare optima de matrici Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <fstream>

using namespace std;

ifstream fin("podm.in");
ofstream fout("podm.out");

long long n, d[510], cmin[510][510];

void citire();
void pd();
void afisare();
//void afisare_rec(int i, int j);
int minim(int a, int b);

int main()
{
	citire();
	pd();
	afisare();
	fout.close();
	return 0;
}

void citire()
{
    int i;
	fin>>n; //citim nr de matrici inmultite
	for(i=1;i<=n+1;i++) //citim cele n+1 dimensiuni
		fin>>d[i];
}

void pd()
{
	int i, j, k, lg, p;
	//initializam
	for(i=1;i<=n;i++)
        cmin[i][i]=0;
	for(i=1;i<=n;i++)
	{
	    cmin[i+1][i];
        cmin[i][i+1]=d[i]*d[i-1]*d[i+1];
	}

	for(lg=2;lg<=n-1;lg++) // lungimea secventei
		for(i=1;i<=n-lg;i++) // inceputul secventei
		{
			j=i+lg; // sfarsitul secventei
            cmin[i][j]=1000000000;
            for(k=i;k<j;k++)
            {
                /*
                p= cmin[i][k] + cmin[k+1][j] + d[i-1]*d[k]*d[j];
                if(p<cmin[i][j])
                {
                    cmin[i][j]=p;
                    cmin[j][i]=k;
                }*/
                cmin[i][j]=minim(cmin[i][j], cmin[i][k]+cmin[k+1][j]+d[i-1]*d[k]*d[j]);
            }
		}
}

int minim(int a, int b)
{
    if(a>b)
        return a;
    return b;
}

void afisare()
{
	fout<<cmin[1][n];
	fout<<'\n';
	//afisare_rec(1,n);
}

/*
void afisare_rec(int i,int j) // afiseaza parantezarea optimala a matricilor de la Ai ... Aj
{
    if(i==j)
    {
        fout<<"A"<<i;
    }
    if(cmin[i][j]==i)
        fout<<"A"<<i;
    else
    {
        fout<<"(";
        afisare_rec(cmin[j][i], j);
        fout<<")";
    }
    fout<<"*";
    if(cmin[j][i]+1==j)
        fout<<"A"<<j;
    else
    {
       fout<<"(";
       afisare_rec(cmin[j][i]+1, j);
       fout<<")";
    }

}*/