Pagini recente » Cod sursa (job #825053) | Cod sursa (job #2808334) | Cod sursa (job #3329396) | Cod sursa (job #763958) | Cod sursa (job #3346573)
#include<iostream>
#include<fstream>
#include<vector>
#include<climits>
using namespace std;
int main() {
ifstream fin("podm.in");
int n, i, j, k;
fin >> n;
//matricea dp[i][j] - in care retin inmultirile pe fiecare subinterval i....j
vector<int> d(n + 1);
vector<vector<int>> dp(n + 1, vector<int>(n + 1));
for (i = 0; i <= n; i++)
fin >> d[i];
for (i = 0; i <= n; i++)
dp[i][i] = 0;
//len = lungimea intervalului i..j pe care vrem sa l calculam
//len este chiar j - i + 1, care necesita sa l calculam numai cand lungimea sa e >= 2
//i startul intervaluiui
//len = j - i + 1 => j = i + len - 1 (sfarsitul intervalului)
//i + len - 1 <= n rezulta ca i <= n - len + 1
for (int len = 2; len <= n; len++) {
for (i = 1; i <= n - len + 1; i++) {
j = i + len - 1;
dp[i][j] = INT_MAX;
for (k = i; k <= j - 1; k++)
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + d[i - 1] * d[k] * d[j]);
}
}
ofstream fout("podm.out");
fout << dp[1][n];
fout.close();
}