Cod sursa(job #427187)

Utilizator hendrikHendrik Lai hendrik Data 27 martie 2010 17:15:17
Problema Parantezare optima de matrici Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;

typedef long long ll;
const ll oo=(ll)1e18;
int n;
ll x[501],f[501][501];

void min(ll &a,ll b){
    if (a>b) a=b;
}

ll dp(int a,int b){
    if (f[a][b]!=-1) return f[a][b];
    ll &res=f[a][b];
    res=oo;
    for (int i=a;i<b;i++){
        ll tmp=x[a]*x[i+1]*x[b+1];
        if (tmp<res){
            min(res,dp(a,i)+dp(i+1,b)+tmp);
        }
    }
    return res;
}

void open(){
    freopen("podm.in","r",stdin);
    freopen("podm.out","w",stdout);
}

void get(ll &a){
    char c;
    while (c=getchar()){
        if (c>='0' && c<='9'){
            a=(ll)(c-'0');
            break;
        }
    }
    while (c=getchar()){
        if (c>='0' && c<='9'){
            a=(a<<1LL)+(a<<3LL)+(ll)(c-'0');
        }
        else break;
    }
}

int main(){
    open();
    scanf("%d",&n);
    for (int i=0;i<=n;i++) get(x[i]);
    for (int i=0;i<n;i++){
        for (int j=i;j<n;j++){
            if (i==j) f[i][j]=0;
            else if (i+1==j) f[i][j]=x[i]*x[i+1]*x[j+1];
            else f[i][j]=-1;
        }
    }
    printf("%lld\n",dp(0,n-1));
    return 0;
}