Cod sursa(job #2071830)

Utilizator vladm98Munteanu Vlad vladm98 Data 21 noiembrie 2017 03:41:59
Problema Parantezare optima de matrici Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<iostream>
#include<fstream>
 
using namespace std;
 
const int MAXN = 505;
const long long INF = 1LL<<62;
int d[MAXN];
long long dp[MAXN][MAXN];
int kk[MAXN][MAXN];
int main() {
    ifstream f("podm.in");
    ofstream g("podm.out");
     
    int n;
    f >> n;
    for (int i = 1; i <= n+1; i++) {
        f >> d[i];
    }
 
    //cout << INF << endl;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            dp[i][j] = INF;
        }
    }
     
    for (int i = 1; i <= n; i++) {
        dp[i][i] = 0;
        kk[i][i+1] = 0;
        dp[i][i+1] = (long long)d[i]*d[i+1]*d[i+2];
    }
 
    for (int j = 2; j <= n-1; j++) {
        for (int i = 1; i <= n && i+j <= n; i++) {
            for (int k = kk[i][i+j-1]; k <= kk[i+1][j] + 2; k++) {
                if (dp[i][i+j] > dp[i][i+k] + dp[i+k+1][i+j] + (long long)d[i]*d[i+k+1]*d[i+j+1]){
                    dp[i][i+j] = min(dp[i][i+j], dp[i][i+k] + dp[i+k+1][i+j] + (long long)d[i]*d[i+k+1]*d[i+j+1]);
                    kk[i][i+j] = k;
                }
            }
        }
    }
 
    g << dp[1][n] << '\n';
 
    return 0;
}