Pagini recente » Cod sursa (job #2042638) | Cod sursa (job #1467786) | Cod sursa (job #1948762) | Cod sursa (job #3215837) | Cod sursa (job #2953411)
#include <fstream>
using namespace std;
ifstream cin("podm.in");
ofstream cout("podm.out");
///////////////////////////////////////
const int MAX = 5e2 + 3;
const long long INF = 1e15;
long long v[MAX] , n;
long long dp[MAX][MAX];
////////////////////////////////////
// descriere dinamica : dp[i][j] = numarul minim de inmultiri dintre matrici pentru intervalul [i,j]
// recurenta : dp[i][j] = max(dp[i][k] + dp[k][i] + (v[x] * v[y] * v[k]))
////////////////////////////////////
long long dinamica( int x , int y ){
if(dp[x][y] != INF) return dp[x][y];
for(int i = x + 1 ; i < y ; i++){
dp[x][y] = min(dp[x][y] , 1LL * dinamica(x,i) + dinamica(i,y) + v[x] * v[y] * v[i]);
}
return dp[x][y];
}
int main(){
cin >> n;
n++;
for(int i = 1 ; i <= n ; i++){
cin >> v[i];
dp[i][i] = dp[i][i+1] = 0;
}
// base case
for(int i = 1 ; i <= n ; i++){
for(int j = i + 2 ; j <= n ; j++) dp[i][j] = INF;
}
cout << dinamica(1,n);
return 0;
}