1. Recursive Permutation of Cuts
Intuition
Recursively try every possible cut as the first cut, dividing the stick into two sub-sticks.
Algorithm
- Define
solve(left, right, availableCuts). - For each cut in availableCuts within (left, right):
- Cost = (right - left) +
solve(left, cut)+solve(cut, right). - Return minimum cost among all choices.
#include <iostream>#include <vector>#include <algorithm>#include <climits> using namespace std; class Solution { int solve(int left, int right, const vector<int>& cuts) { int minCost = 1e9; bool hasCut = false; for (int c : cuts) { if (c > left && c < right) { hasCut = true; int cost = (right - left) + solve(left, c, cuts) + solve(c, right, cuts); minCost = min(minCost, cost); } } return hasCut ? minCost : 0; }public: int minCost(int n, vector<int>& cuts) { return solve(0, n, cuts); }}; int main() { Solution sol; vector<int> cuts = {1, 3, 4, 5}; cout << "Min Cost: " << sol.minCost(7, cuts) << endl; return 0;}Time & Space Complexity
- Time complexity:
O(c!) - Space complexity:
O(c) call stack