Cod sursa(job #2450577)

Utilizator ShayTeodor Matei Shay Data 23 august 2019 17:50:46
Problema Parantezare optima de matrici Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>

#define BUFFER_SIZE 1 << 30
char buffer[BUFFER_SIZE];
int pos = BUFFER_SIZE;
long long dp[505][505], d[505];

inline char next() {
	if (pos == BUFFER_SIZE) {
		fread(buffer, 1, BUFFER_SIZE, stdin);
		pos = 0;
	}

	return buffer[pos++];
}

inline long long read() {
	long long n = 0;
	char c = next();

	while (!('0' <= c && c <= '9')) {
		c = next();
	}

	while ('0' <= c && c <= '9') {
		n = (n << 3) + (n << 1) + (c - '0');
		c = next();
	}

	return n;
}

inline void print(long long n) {
	char snum[65];
	int i = 0;

	do {
		snum[i++] = n % 10 + '0';
		n /= 10;
	} while (n);

	--i;

	while (i >= 0) {
		putchar(snum[i--]);
	}

	putchar('\n');
}

inline int min(long long a, long long b) {
    return a < b ? a : b;
}

int main() {
    freopen("podm.in", "r", stdin);
    freopen("podm.out", "w", stdout);

    int n = read();

    for (int i = 0 ; i <= n ; ++i) {
        d[i] = read();
    }

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

    for (int l = 2 ; l < n ; ++l) {
        for (int i = 1 ; i <= n - l ; ++i) {
            int j = i + l;
            dp[i][j] = INT_MAX;

            for (int k = i ; k < j; ++k) {
                dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + 1LL*(d[i - 1] * d[k] * d[j]));
            }
        }
    }

    printf("%lld\n", dp[1][n]);

    return 0;
}