Cod sursa(job #3346850)

Utilizator Vladutz20Gilca Florian-Vladut Vladutz20 Data 15 martie 2026 12:43:01
Problema Parantezare optima de matrici Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>

using namespace std;

class Podm {
private:
    vector<long long> d;
    int n;
    string input_file, output_file;

public:
    vector<vector<long long>> dp;

    Podm(string input_file, string output_file) {
        this->input_file = input_file;
        this->output_file = output_file;
    }

    void read_input() {
        ifstream fin(input_file);
        if (!(fin >> n)) return;
        d.resize(n + 1);
        for (int i = 0; i <= n; i++) {
            fin >> d[i];
        }
        dp.resize(n + 1);
        for (int i = 0; i <= n; i++) {
            dp[i].resize(n + 1, -1);
        }
        fin.close();
    }

    long long solve_dp() {
        for (int i = 1; i <= n; i++) {
            dp[i][i] = 0;
        }

        for (int i = 1; i < n; i++) {
            dp[i][i + 1] = d[i - 1] * d[i] * d[i + 1];
        }

        for (int len = 3; len <= n; len++) {
            for (int i = 1; i <= n - len + 1; i++) {
                int j = i + len - 1;
                for (int k = i; k < j; k++) {
                    long long cost = dp[i][k] + dp[k + 1][j] + d[i - 1] * d[k] * d[j];
                    if (dp[i][j] == -1 || cost < dp[i][j]) {
                        dp[i][j] = cost;
                    }
                }
            }
        }
        return dp[1][n];
    }

    void write_output() {
        ofstream fout(output_file);
        fout << solve_dp() << "\n";
        fout.close();
    }
};

int main() {
    Podm p("podm.in", "podm.out");
    p.read_input();
    p.write_output();
    return 0;
}