Cod sursa(job #1023456)

Utilizator sziliMandici Szilard szili Data 6 noiembrie 2013 23:25:50
Problema Parantezare optima de matrici Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <queue>
#include <vector>

using namespace std;

typedef struct element{
    int value;
    int left;
    int right;
    int index;
} ELEMENT;

struct cmmp{
    bool operator() (const ELEMENT &el1, const ELEMENT &el2){
        return el1.value < el2.value;
    }
};

ELEMENT a[502];

int main()
{
    freopen("podm.in", "r", stdin);
    freopen("podm.out", "w", stdout);

    int n;
    scanf("%d", &n);
    n++;

    int firstNumber;
    scanf("%d", &firstNumber);

    priority_queue<ELEMENT, vector<ELEMENT>, cmmp> q;

    for (int i=1; i<(n-1); i++){
        ELEMENT e;
        scanf("%d", &e.value);
        e.left = i-1;
        e.right = i+1;
        e.index = i;
        a[i] = e;
        q.push(e);
    }
    ELEMENT firstElement;
    firstElement.index = 0;
    firstElement.value = firstNumber;
    firstElement.left =-1;
    firstElement.right = 1;

    a[0] = firstElement;

    int lastNumber;
    scanf("%d", &lastNumber);

    ELEMENT lastElement;
    lastElement.index = n;
    lastElement.value = lastNumber;
    lastElement.left =n-1;
    lastElement.right = -1;


    a[n-1] = lastElement;
    long long solution = 0;

    while (q.size() > 1){
        ELEMENT e = q.top();
        q.pop();

        ELEMENT updatedElement = a[e.index];
        solution += a[updatedElement.left].value * updatedElement.value * a[updatedElement.right].value;

        a[updatedElement.left].right = a[updatedElement.right].index;
        a[updatedElement.right].left = a[updatedElement.left].index;
    }

    solution += firstNumber * a[q.top().index].value * lastNumber;

    printf("%lld", solution);

    return 0;
}