Cod sursa(job #1074165)

Utilizator classiusCobuz Andrei classius Data 7 ianuarie 2014 12:23:36
Problema Parantezare optima de matrici Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
using namespace std;

#include<cstdio>
#include<utility>

const int MAXN=510;

long long dp[MAXN][MAXN];
pair<long long,long long> ds[MAXN][MAXN];

int main(){
    freopen("podm.in","r",stdin);
    freopen("podm.out","w",stdout);
    int n;
    long long d[MAXN];
    
    scanf("%d",&n);
    for(int i=0;i<=n;i++){
        scanf("%I64d",&d[i]);
    }
    
    
    for(int i=1;i<=n;i++){
        ds[i][i].first=d[i-1];
        ds[i][i].second=d[i];
    }
    
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            dp[i][j]=1LL<<60;
        }
    }
    
    for(int i=1;i<=n;i++){
        dp[i][i]=0;
    }
    
    for(int l=1;l<n;l++){
        for(int i=1;i+l<=n;i++){
            for(int t=i;t<i+l;t++){
                int sum;
                sum=dp[i][t]+dp[t+1][i+l]+
                    ds[i][t].first*ds[i][t].second*ds[t+1][i+l].second;
                if(sum<dp[i][i+l]){
                    dp[i][i+l]=sum;
                    ds[i][i+l].first=ds[i][t].first;
                    ds[i][i+l].second=ds[t+1][i+l].second;
                }
            }
        }
    }
    
    printf("%I64d",dp[1][n]);
    
    return 0;
}