Pagini recente » Cod sursa (job #2535780) | Cod sursa (job #2914873) | Cod sursa (job #104368) | Cod sursa (job #1045885) | Cod sursa (job #396037)
Cod sursa(job #396037)
#include <stdio.h>
#define INFINIT 1000000000000ll
#define minim(a, b) (a < b ? a : b)
#define N 500
long long dim[N + 2];
long long m[N + 1][N + 1];
int n;
void citeste()
{
FILE* fi = fopen("podm.in", "r");
fscanf(fi, "%d", &n);
int i;
for(i = 1; i <= n + 1; ++i) fscanf(fi, "%lld", &dim[i]);
fclose(fi);
}
void scrie()
{
FILE* fo = fopen("podm.out", "w");
fprintf(fo, "%lld\n", m[1][n]);
fclose(fo);
}
inline void init()
{
int i, j;
for(i = 1; i <= n; ++i) for(j = 1; j <= n; ++j) m[i][j] = -1;
}
void calculeaza()
{
int i, j, k, rand;
long long valmin, candidat;
for(i = 1; i <= n; ++i) m[i][i] = 0;
for(rand = 2; rand <= n; ++rand)
{
i = 0, j = rand - 1;
while(j < n)
{
++i;
++j;
valmin = INFINIT;
for(k = i; k <= j - 1; ++k)
{
candidat = m[i][k] + m[k + 1][j] + dim[i] * dim[k + 1] * dim[j + 1];
valmin = minim(valmin, candidat);
}
m[i][j] = valmin;
}
}
}
long long podm(int i, int j)
{
if(m[i][j] != -1) return m[i][j]; //valoarea a fost calculata
//in cazul in care valoarea nu a fost calculata
if(i == j) return m[i][j] = 0; //o matrice nu se va inmulti cu ea insasi
// i != j
long long valmin = -1, candidat;
int k;
for(k = i; k <= j - 1; ++k)
{
candidat = podm(i, k) + podm(k + 1, j) + (long long)dim[i] * (long long)dim[k + 1] * (long long)dim[j + 1];
if(candidat < valmin || valmin == -1) valmin = candidat;
}
m[i][j] = (valmin == -1 ? 0 : valmin);
return valmin;
}
int main()
{
citeste();
init();
//podm(1, n);
calculeaza();
scrie();
return 0;
}