Pagini recente » Cod sursa (job #613752) | Cod sursa (job #955148) | Cod sursa (job #2879620) | Cod sursa (job #2098489) | Cod sursa (job #3299958)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("podm.in");
ofstream fout("podm.out");
/**
dp[i,j] = numarul minim de operatii necesar pentru a
inmulti Ai * A[i+1] * .. Aj
A1 x A2 x ... B[i..j] x A[j+1] x ... x An
Sol dp[1][n]
Date initiale: dp[i][i] = 0
dp[i][i+1] = v[i-1]*v[i]*v[i+1], i=1..n-1
Recurente:
A[i] A[i+1] A[i+2] ... A[k] ... A[j-1] A[j]
dp[i][j] = min{
dp[i][i] + dp[i+1][j] + v[i-1]*v[i]*v[j]
dp[i,i+1] + dp[i+2][j] + v[i-1]*v[i+1]*v[j]
dp[i,i+2] + dp[i+3][j] + v[i-1]*v[i+2]*v[j]
....
dp[i,j-1] + dp[j][j] + v[i-1]*v[j-1]*v[j]
}
dp[i][j] = min{dp[i][k-1] + dp[k][j] + v[i-1]*v[k-1]*v[j],k=i+1..j}
*/
long long dp[502][502], v[502];
int n;
int main()
{
int i, j, d, k;
long long minn;
fin >> n;
for (i = 0; i <= n; i++)
fin >> v[i];
/// init.
for(i = 1; i < n; i++)
dp[i][i+1] = v[i-1]*v[i]*v[i+1];
/// recurente
for (d = 2; d < n; d++)
for (i = 1; i <= n - d; i++)
{
j = i + d;
minn = (1LL << 60);
for (k = i + 1; k <= j; k++)
minn = min(minn, dp[i][k-1] + dp[k][j] + v[i-1]*v[k-1]*v[j]);
dp[i][j] = minn;
}
fout << dp[1][n] << "\n";
return 0;
}