Cod sursa(job #2155696)

Utilizator fylot3Bogdan Filote fylot3 Data 8 martie 2018 00:10:36
Problema Parantezare optima de matrici Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <stdio.h>
#include <vector>
#include <algorithm>
#define MAXN	500
#define MIN_INIT	10000000000000

int n;
std::vector<int> d;
long long dp[MAXN + 1][MAXN + 1];

long long solve_podm() {
	int j;
	long long minNumMul;

	//dp[0][0] = 0;

	for (int diag = 2; diag <= n; diag++) {
		for (int i = 1; i <= n - diag + 1; i++) {
			j = diag + i - 1;
			if (j == i) {
				dp[i][j] = 0;
			}
			else if (j == i + 1) {
				dp[i][j] = 1LL * d[i - 1] * d[i] * d[i + 1];
			}
			else {
				minNumMul = MIN_INIT;
				for (int k = i; k <= j - 1; k++) {
					minNumMul = std::min(minNumMul,
						dp[i][k] + dp[k + 1][j] + d[i - 1] * d[k] * d[j]);
				}
				dp[i][j] = minNumMul;
			}
		}
	}

	return dp[1][n];
}

int main(void) {

	FILE *fin = fopen("podm.in", "r");
	fscanf(fin, "%d", &n);

	for (int i = 0, e; i <= n; i++) {
		fscanf(fin, "%d", &e);
		d.push_back(e);
	}
	fclose(fin);

	FILE *fout = fopen("podm.out", "w");
	fprintf(fout, "%lld\n", solve_podm());
	fclose(fout);
	return 0;
}