Cod sursa(job #3350123)

Utilizator tjilaJilaveanu Tudor tjila Data 5 aprilie 2026 17:54:40
Problema Parantezare optima de matrici Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <iostream>
#include <limits>
#include <vector>

std::ifstream fin("podm.in");
std::ofstream fout("podm.out");

const auto INF = std::numeric_limits<unsigned long long>::max();

class Solution {
  public:
    unsigned long long solve_podm(int n, const std::vector<int> &d) {
        std::vector<std::vector<unsigned long long>> dp(
            n + 1, std::vector<unsigned long long>(n + 1, INF));

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

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

        for (int j = 2; j <= n; j++) {
            for (int i = 1; i + j - 1 <= n; i++) {
                int k = i + j - 1;
                for (int t = i; t < k; t++) {
                    unsigned long long new_sol =
                        dp[i][t] + dp[t + 1][k] + 1ULL * d[i - 1] * d[t] * d[k];
                    dp[i][k] = std::min(dp[i][k], new_sol);
                }
            }
        }
        return dp[1][n];
    }
};

int main() {
    int n;
    fin >> n;
    std::vector<int> d(n + 1);
    for (int i = 0; i <= n; i++) {
        fin >> d[i];
    }

    Solution sol;
    unsigned long long ans = sol.solve_podm(n, d);
    fout << ans;
}