Cod sursa(job #2120523)

Utilizator preda.andreiPreda Andrei preda.andrei Data 2 februarie 2018 16:10:40
Problema Parantezare optima de matrici Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <cstdint>
#include <fstream>
#include <vector>

using namespace std;

int64_t Solve(const vector<int> &dim)
{
    int count = dim.size() - 1;
    vector<vector<int64_t>> cost(count, vector<int64_t>(count));

    for (int i = 0; i < count; ++i) {
        cost[i][i] = 0;
        if (i > 0) {
            cost[i - 1][i] = 1LL * dim[i - 1] * dim[i] * dim[i + 1];
        }
    }

    for (int len = 3; len <= count; ++len) {
        for (int i = 0; i + len - 1 < count; ++i) {
            auto end = i + len - 1;
            cost[i][end] = (1LL << 50);

            for (int j = i; j < end; ++j) {
                auto new_cost = cost[i][j] + cost[j + 1][end];
                new_cost += 1LL * dim[i] * dim[j + 1] * dim[end + 1];
                cost[i][end] = min(cost[i][end], new_cost);
            }
        }
    }
    return cost[0].back();
}

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

    int n;
    fin >> n;

    vector<int> dim(n + 1);
    for (auto &elem : dim) {
        fin >> elem;
    }

    auto res = Solve(dim);
    fout << res << "\n";

    return 0;
}