Pagini recente » Cod sursa (job #2206044) | Cod sursa (job #2461244) | Cod sursa (job #2484077) | Cod sursa (job #1729959) | Cod sursa (job #3330125)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("podm.in");
ofstream fout("podm.out");
/**
4
a = 13 5 89 3 34
A1(13, 5) A2(5,89) A3(89,3) A4(3,34)
((A1 x A2) x A3) x A4 = 13*5*89 + 13*89*3 + 13*3*34
(A1 x (A2 x A3)) x A4 = 5*89*3 + 13*5*3 + 13*3*34
C(n, p) = A(n, m) x B(m, p)
O(n * m * p)
c[i][j] = a[i][1] * b[1][j] + a[i][2]*b[2][j] + ...
+ a[i][m] * b[m][j]
dp[i,j] = costul minim pentru a inmulti Ai x A[i+1] ... x Aj
Sol: dp[1][n]
A1(a[0], a[1]), A2(a[1], a[2]), ..., Ai (a[i-1],a[i])
Date initiale: dp[i][i] = 0
dp[i][i+1] = a[i-1]*a[i]*a[i+1]
Recurenta:
dp[i][j] = Ai x (A[i+1] x .. x A[j])
(Ai x A[i+1]) x (A[i+2] x ... x A[j])
....
(A[i] x A[i+1] x .. x A[k]) x (A[k+1] x ... x A[j])
...
(A[i] x ... x A[j-1]) x A[j]
dp[i][i] + dp[i+1,j] + a[i-1]*a[i]*a[j]
dp[i][i+1]+dp[i+2][j] + a[i-1]*a[i+1]*a[j]
...
dp[i][k] + dp[k+1][j] + a[i-1]*a[k]*a[j]
dp[i,j] = min{dp[i][k] + dp[k+1][j] + a[i-1]*a[k]*a[j],k=i..j-1}
*/
int a[505], n;
long long dp[505][505];
int main()
{
int i, j, k;
long long minim;
fin >> n;
for(i = 0; i <= n; i++) fin >> a[i];
for(i = 1; i < n; i++) dp[i][i + 1] = 1LL * a[i - 1] * a[i] * a[i + 1];
for(i = n - 2; i >= 1; i--)
for(j = i + 2; j <= n; j++)
{
minim = (1LL << 60);
for(k = i; k < j; k++)
minim = min(minim, dp[i][k] + dp[k + 1][j] + 1LL * a[i - 1] * a[k] * a[j]);
dp[i][j] = minim;
}
fout << dp[1][n] << '\n';
return 0;
}