Pagini recente » Monitorul de evaluare | Cod sursa (job #2399703) | Cod sursa (job #2777033) | Cod sursa (job #2719696) | Cod sursa (job #2744179)
#include <fstream>
using namespace std;
uint64_t find_min(uint64_t dp[][501],
uint64_t *d, uint64_t i, uint64_t j) {
uint64_t min_multiplies = dp[i][i] + dp[i + 1][j] + d[i - 1] * d[i] * d[j];
for (uint64_t k = i + 1; k < j; k++) {
uint64_t multiplies = d[i - 1] * d[k] * d[j];
multiplies = multiplies + (dp[i][k] + dp[k + 1][j]);
if (multiplies < min_multiplies) {
min_multiplies = multiplies;
}
}
return min_multiplies;
}
int main() {
ifstream fin("podm.in");
ofstream fout("podm.out");
uint64_t n;
fin >> n;
uint64_t d[n + 2];
for (uint64_t i = 0; i <= n; i++) {
fin >> d[i];
}
uint64_t dp[501][501];
for (uint64_t i = 1; i <= n; i++) {
dp[i][i] = 0;
dp[i][i + 1] = d[i - 1] * d[i] * d[i + 1];
}
for (uint64_t i = 2; i <= n; i++) {
for (uint64_t j = 1; j <= n - i; j++) {
dp[j][j + i] = find_min(dp, d, j, j + i);
}
}
fout << dp[1][n];
return 0;
}