Cod sursa(job #2581480)

Utilizator ioana.nedelcuNedelcu Ioana-Teodora ioana.nedelcu Data 15 martie 2020 13:01:51
Problema Parantezare optima de matrici Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <bits/stdc++.h>
#include <vector>
using namespace std;

const unsigned long long kInf = numeric_limits<unsigned long long>::max();

class Task {
public:
    void solve () {
        read_input();
        print_output(get_result());
    }

private:
    int n;
    vector<int> v;

    void read_input() {
        ifstream fin ("podm.in");
        fin>>n;
        int aux;
        //v.push_back(-1); //v[0]; element fictiv
        for (int i = 0; i <= n; i++) {
            fin>>aux;
            v.push_back(aux);
        }
        fin.close();
    }

    unsigned long long get_result () {

        vector<vector<unsigned long long>> dp (n+1, vector<unsigned long long> (n+1, kInf));

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

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

        for (int len =2; len <= n; ++len) {
            for (int i = 1; i + len - 1 <= n; ++i) {
                int j = i + len - 1;

                for (int k = i; k < j; k++) {
                    unsigned  long long aux = dp[i][k] + dp[k+1][j] + 1ULL * v[i-1] * v[k] * v[j];

                    dp[i][j] = min (aux, dp[i][j]);
                }
            }
        }

        return dp[1][n];
    }

    void print_output (unsigned long long result) {
        ofstream fout ("podm.out");
        fout<<result;
        fout.close();
    }
};

int main() {

    Task * task = new Task();
    task -> solve();
    delete task;

    return 0;
}