Pagini recente » Cod sursa (job #1305460) | Cod sursa (job #3191075) | Cod sursa (job #2365941) | Cod sursa (job #1542926) | Cod sursa (job #2772267)
#include <fstream>
using namespace std;
unsigned long podm(const int *d, const int n) {
int i, j, k;
unsigned long m[n][n];
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
m[i][j] = 0UL;
// d[i] = nr de linii pentru matricea i,
// d[i + 1] = nr de coloane pentru matricea i
for (i = 0; i < n - 1; i++)
m[i][i + 1] = 1UL * d[i] * d[i + 1] * d[i + 2];
// calculez m[i][i + k]
for (k = 2; k <= n - 1; k++) {
// lungimea unei diagonale e n - k la un pas
for (i = 0; i < n - k; i++) {
unsigned long minCost = m[i][i] + m[i + 1][i + k]
+ 1UL * d[i] * d[i + 1] * d[i + k + 1];
for (j = 1; j <= k - 1; j++) {
unsigned long q = m[i][i + j] + m[i + j + 1][i + k];
q += 1UL * d[i] * d[i + j + 1] * d[i + k + 1];
if (q < minCost)
minCost = q;
}
m[i][i + k] = minCost;
}
}
return m[0][n - 1];
}
int main(void) {
ifstream in("podm.in");
ofstream out("podm.out");
int n;
in >> n;
int d[n + 1];
for (int i = 0; i <= n; i++)
in >> d[i];
out << podm(d, n);
in.close();
out.close();
return 0;
}