Cod sursa(job #2224292)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 23 iulie 2018 17:02:56
Problema Parantezare optima de matrici Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

const string IN_FILE = "podm.in";
const string OUT_FILE = "podm.out";
const int64_t INF = 1LL << 60;

int64_t solve(const vector<int>& sizes) {
    const int n = int(sizes.size());
    auto dp = vector<vector<int64_t>>(n, vector<int64_t>(n, INF));
    for (int i = 0; i + 1 < n; i++) {
        dp[i][i + 1] = 0;
    }
    for (int len = 3; len <= n; len++) {
        for (int i = 0, j = len - 1; j < n; i++, j++) {
            for (int k = i + 1; k < j; k++) {
                const int64_t cost = 1LL * sizes[i] * sizes[k] * sizes[j];
                dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j] + cost);
            }
        }
    }
    return dp[0][n - 1];
}

vector<int> readSizes() {
    ifstream in(IN_FILE);
    int n;
    in >> n;
    auto sizes = vector<int>(n + 1);
    for (int i = 0; i <= n; i++) {
        in >> sizes[i];
    }
    in.close();
    return sizes;
}

void writeOutput(const int64_t result) {
    ofstream out(OUT_FILE);
    out << result << "\n";
    out.close();
}

int main() {
    const auto sizes = readSizes();
    const int64_t result = solve(sizes);
    writeOutput(result);
    return 0;
}