Cod sursa(job #819431)

Utilizator teonasipoteanuTeona Sipoteanu teonasipoteanu Data 18 noiembrie 2012 23:01:43
Problema Parantezare optima de matrici Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>

using namespace std;

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

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

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=0;i<=n;i++) //citim cele n+1 dimensiuni
		fin>>d[i];
}

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


	for(lg=1;lg<n;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<<")";
    }

}*/