Cod sursa(job #2024484)

Utilizator patricia.predaPatricia Preda patricia.preda Data 20 septembrie 2017 18:46:53
Problema Parantezare optima de matrici Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 kb
#include <iostream>
#include <cstdio>
using namespace std;
long long dp[510][510],d[510];
int n,incep[510],inchei[510],stanga,dreapta;
void citire()
{
    scanf("%d",&n);
    for(int i=0;i<=n;i++)
        scanf("%lld",&d[i]);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            dp[i][j]=123456789123456789;
}
void operatii()
{
    for(int i=1;i<=n;i++)
            {
                dp[i][i]=0;
            }
    for(int d1=1;d1<=n;d1++)
    {
        for(int i=1;i+d1<=n;i++)
        {
            for(int k=i;k<=i+d1;k++)
            {
                if(dp[i][i+d1]>dp[i][k]+dp[k+1][i+d1]+d[i-1]*d[k]*d[i+d1])
                    {
                        dp[i][i+d1]=min(dp[i][i+d1],dp[i][k]+dp[k+1][i+d1]+d[i-1]*d[k]*d[i+d1]);
                        dp[i+d1][i]=k;
                    }
            }
        }
    }
}
void afisare()
{
    printf("%lld\n",dp[1][n]);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=incep[i];j++)
            printf("(");
        printf("A%d",i);
        for(int j=1;j<=inchei[i];j++)
            printf(")");
    }
}
void rezolv(int i,int j)
{
    if(i==j&&stanga==1)
    {
        incep[i]++;
        return;
    }
    else
        if(i==j&&dreapta==1)
           {
               inchei[i]++;
               return ;
           }
    stanga=1;
    dreapta=0;
    incep[i]++;
    rezolv(i,dp[j][i]);
        stanga=0;
        dreapta=1;
    inchei[j]++;
    rezolv(dp[j][i]+1,j);
}
void aranjam()
{
    for(int i=1;i<=n;i++)
    {
        int ok=0;
        for(int j=i;j<=n&&ok==0;j++)
            if(incep[i]>1&&inchei[j]>1)
        {
            if(inchei[i]>incep[i])
            {
                incep[i]=1;
                inchei[i]-=(inchei[i]-incep[i]);
                ok=1;
            }
            else
            {
                inchei[i]=1;
                incep[i]-=(incep[i]-inchei[i]);
                ok=1;
            }
        }
    }
}
int main()
{
    freopen("podm.in","r",stdin);
    freopen("podm.out","w",stdout);
    citire();
    operatii();
    rezolv(1,n);
    aranjam();
    afisare();
   // cout << "Hello world!" << endl;
    return 0;
}