Cod sursa(job #799581)

Utilizator penultim_oVijiala Tudor Gabriel penultim_o Data 19 octombrie 2012 14:42:42
Problema Parantezare optima de matrici Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>
#include <iostream>
using namespace std;
ifstream in("podm.in");
ofstream out("podm.out");
const int nmax = 550;
struct par
{
    int l; int r;
};
par t[nmax], f[nmax], f2[nmax];
int v[nmax], mk=0, mf=0, b[nmax][nmax],n;

void init()
{
    mk=0; mf=0;
    for(int i=0; i<=n; i++)
    {
        for(int j=0; j<=n; j++) b[i][j]=0;
        f2[i].r = f2[i].l = 0;
    }
}

int m(int i, int j, int c)
{
    if(i>=j-1) return 0;
    if(b[i][j]) return b[i][j];
    int d, p, kmin=0; if(c) d = 0; else d = 0x4FFFFFF0;
    for(int k = i+1; k<j; k++)
    {
        p = m(i,k,c) + m(k, j,c) + v[i]*v[k]*v[j];
        if(p<d&&!c || p>d&&c) d=p, kmin=k;
    }
    //        cout << "i: " << i << " k: " << kmin << " j: " << j << " p: " << min << endl;

    b[i][j] = d;

    if(kmin-i>1) {t[mk].l=i; t[mk].r=kmin; mk++;}
    if(j-kmin>1) {t[mk].l=kmin; t[mk].r=j; mk++;}

    return d;
}

int ok(int a, int b, int c, int d)
{
    if(a<c && c<b && b<d) return 0;
    if(c<a && a<d && d<b) return 0;
    return 1;
}

void parant(par x)
{

    int i;
    for(i=0; i<mf; i++)
    {
        if(x.r==f[i].r && x.l==f[i].l) return;
        if(!ok(f[i].l, f[i].r, x.l, x.r)) return;
    }
    f[mf++]=x;
    f2[x.l].l++;
    f2[x.r].r++;
}

void print()
{
    int i,j;
    for(i=1; i<n; i++)
    {
        for(j=0; j<f2[i].l; j++) out << "[ ";
        out << '(' << v[i] << ',' << v[i+1] << ')'; out << " ";
        for(j=0; j<f2[i+1].r; j++) out << "] ";
    }
    out << endl;
}

int main()
{
    int i;
    in >> n; n++;

    for( i=1; i<=n; i++) in >> v[i];
    out << m(1,n, 0) << endl;
    /*for(i=mk-1; i>=0; i--) parant(t[i]);
    print();

    init();

    for( i=1; i<=n; i++) in >> v[i];
    out << m(1,n, 1) << endl;
    for(i=mk-1; i>=0; i--) parant(t[i]);
    print();*/

    return 0;
}