Pagini recente » Cod sursa (job #1598554) | Cod sursa (job #932398) | Cod sursa (job #2076211) | Cod sursa (job #797898) | Cod sursa (job #2684569)
#include<bits/stdc++.h>
using namespace std;
/**
4
13 5 89 3 34
A1(13,5)
A2(5,89)
A3(89,3)
A4(3,34)
dp[i,j] = costul minim al inmultirii Ai * A[i+1] *... *Aj
Sol dp[1][n]
Initial:
dp[i][i+1] = a[i-1]*a[i]*a[i+1], i=1..n-1
Recurente:
dp[i][j] = min(dp[i][i] + a[i-1]*a[i]*a[j]
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][j-1]+a[i-1]*a[j-1]*a[j]
)
dp[i][j] = min(dp[i][k]+dp[k+1][j]+a[i-1]*a[k]*a[j], k=i..j-1),
*/
long long dp[503][503], a[503];
int n;
int main()
{
int i, j, k, d;
long long x;
cin >> n;
for (i = 0; i <= n; i++)
cin >> a[i];
/// init:
for (i = 1; i <= n; i++)
dp[i][i+1] = a[i-1]*a[i]*a[i+1];
/// recurente
for (d = 1; d < n; d++)
for (i = 1; i <= n - d; i++)
{
j = i + d;
x = (1LL << 60);
for (k = i; k < j; k++)
x = min(x, dp[i][k] + dp[k+1][j] + a[i-1]*a[k]*a[j]);
dp[i][j] = x;
}
cout << dp[1][n];
return 0;
}