🎉 One-stop destination for all your technical interview Preparation 🎉
int f(vector<int>& cuts, int i, int j)
{
if (i > j) return 0;
int mn = INT_MAX;
for (int k = i; k <= j; k++) {
int left = f(cuts, i, k - 1);
int right = f(cuts, k + 1, j);
int cost = left + right + cuts[j + 1] - cuts[i - 1];
mn = min(mn, cost);
}
return mn;
}
// n = total numbers, c = no. of cuts
int cost(int n, int c, vector<int>& cuts)
{
cuts.push_back(0);
cuts.push_back(n);
sort(cuts.begin(), cuts.end());
return f(cuts, 1, c);
}
int f(vector<int>& cuts, int i, int j, vector<vector<int>>& dp)
{
if (i > j)
return 0;
if (dp[i][j] != -1)
return dp[i][j];
int mn = INT_MAX;
for (int k = i; k <= j; k++) {
int left = f(cuts, i, k - 1, dp);
int right = f(cuts, k + 1, j, dp);
int cost = left + right + cuts[j + 1] - cuts[i - 1];
mn = min(mn, cost);
}
return dp[i][j] = mn;
}
int cost(int n, int c, vector<int>& cuts)
{
cuts.push_back(0);
cuts.push_back(n);
sort(cuts.begin(), cuts.end());
vector<vector<int>> dp(c + 1, vector<int>(c + 1, -1));
return f(cuts, 1, c, dp);
}
int cost(int n, int c, vector<int>& cuts)
{
cuts.push_back(0);
cuts.push_back(n);
sort(cuts.begin(), cuts.end());
vector<vector<int>> dp(c + 2, vector<int>(c + 2, 0));
for (int i = c; i >= 1; i--) {
for (int j = 1; j <= c; j++) {
if (i > j)
continue;
int mn = INT_MAX;
for (int k = i; k <= j; k++) {
int left = dp[i][k - 1];
int right = dp[k + 1][j];
int cost = left + right + cuts[j + 1] - cuts[i - 1];
mn = min(mn, cost);
}
dp[i][j] = mn;
}
}
return dp[1][c];
}