Cod sursa(job #2023385)

Utilizator RaduDoStochitoiu Radu RaduDo Data 18 septembrie 2017 21:03:50
Problema Parantezare optima de matrici Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
// Example program
#include <iostream>
#include <fstream>
#include <string>
#include <map>

int constexpr MAXN = 501;
int constexpr MAX_INT = 0x3f3f3f3f;

struct Pair
{
    Pair() : x(), y() {}
    Pair(int x, int y) : x(x), y(y) {}
    int x, y;
};

bool operator<(const Pair & lhs, const Pair & rhs) // lhs = left-hand side
                                                      // rhs = right-hand side
{
    if (lhs.x != rhs.x)
    {
        return lhs.x < rhs.x;
    }
    else
    {
        return lhs.y < rhs.y;
    }
}

std::map <Pair, int> dp;
int d[MAXN];

int pd(int i, int j) {
    if (i == j) {
        return 0;
    }
    
    if(j == i + 1) {
        return d[i] * d[i + 1] * d[i + 2];
    }
    
    if (dp.find({i, j}) != dp.end()) {
        return dp[{i, j}];
    }
    
    int min = MAX_INT;
    for (int k = i; k < j; ++k) {
        int curr_sum = pd(i, k) + pd(k + 1, j) + d[i] * d[k + 1] * d[j + 1];
        if (curr_sum < min) min = curr_sum;
    }
    
    dp[{i, j}] = min;
    return dp[{i, j}];
}
    

int main()
{
    int n, i;
    
    std::ifstream in("podm.in");
    std::ofstream out("podm.out");
    
    in >> n;

    for (i = 0; i <= n; ++i) {
        in >> d[i];
    }

    out << pd(0, n - 1) << "\n";
    return 0;
}