Pagini recente » Cod sursa (job #3322994) | Cod sursa (job #3353723) | Cod sursa (job #3353726) | Cod sursa (job #3347113) | Cod sursa (job #3355304)
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
using namespace std;
// Definim o valoare de infinit suficient de mare pentru long long (10^18)
const long long INF = 1e18;
int main(void) {
int n;
ifstream fin("podm.in");
ofstream fout("podm.out");
if (!(fin >> n)) return 0;
// Folosim long long pentru a preveni overflow-ul la înmulțiri și sume
vector<long long> v(n + 1);
vector<vector<long long>> dp(n, vector<long long>(n, INF));
for (int i = 0; i <= n; i++) {
fin >> v[i];
}
for (int i = 0; i < n; i++) {
dp[i][i] = 0;
}
for (int k = 1; k < n; k++) {
for (int i = 0; i < n - k; i++) {
for (int j = i; j < i + k; j++) {
// Înmulțirea se va face direct pe 64 de biți (long long)
long long cost_curent = dp[i][j] + dp[j + 1][i + k] + v[i] * v[j + 1] * v[i + k + 1];
dp[i][i + k] = min(dp[i][i + k], cost_curent);
}
}
}
fout << dp[0][n - 1] << "\n";
return 0;
}