Cod sursa(job #2312899)

Utilizator SirStevensIonut Morosan SirStevens Data 5 ianuarie 2019 18:23:02
Problema Parantezare optima de matrici Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <algorithm>
#include <vector>
#include <fstream>

#define NMAX 501

using namespace std;

ifstream in("podm.in");
ofstream out("podm.out");

int DP[NMAX][NMAX], n;

vector<int> dim;

void read(){
    in >> n;

    int nr;

    while(in >> nr){
        dim.push_back(nr);
    }


}

void print() {
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n;j ++){
            cout << DP[i][j] << '\t';
        }
        cout << '\n';
    }
}

void solve(){

    for(int i = 1; i < n; i++){
        DP[i][i+1] = dim[i-1]*dim[i]*dim[i+1];

    }


    for(int d = 2; d <= n-1; d++){ // for each diag
        for(int i = 1; i <= n-d; i++){  // for each matrix
            int minn = DP[i][i] + DP[i+1][i+d] + dim[i-1]*dim[i]*dim[i+d];
            int pos = i;
            for(int k = i+1; k < i + d; k++){
                int value = DP[i][k] + DP[k+1][i+d] + dim[i-1]*dim[k]*dim[i+d];
                if(value < minn){
                    minn = value;
                    pos = k;
                }
            }
            DP[i][i+d] = minn;
            DP[i+d][i] = pos;
        }
    }
    //Kprint();

    out << DP[1][n];
}

int main() {
    read();
    solve();
    return 0;
}