Minimum Cost to Cut a Stick
Problem Statement​
Problem Description​
Given a wooden stick of length n units. The stick is labeled from 0 to n. For example, a stick of length 6 is labeled as follows:
0 - 1 - 2 - 3 - 4 - 5 - 6
- 
Given an integer array cutswherecuts[i]denotes a position you should perform a cut at.
- 
You should perform the cuts in order, but you can change the order of the cuts as you wish. 
- 
The cost of one cut is the length of the stick to be cut. The total cost is the sum of costs of all cuts. When you cut a stick, it will be split into two smaller sticks (i.e., the sum of their lengths is the length of the stick before the cut). 
- 
Return the minimum total cost of the cuts. 
Example​
Example 1:
Input:
n = 7, cuts = [1, 3, 4, 5]
Output:
16
Explanation:
- 
Using cuts order = [1, 3, 4, 5] as in the input leads to the following scenario: 
- 
The first cut is done to a rod of length 7 so the cost is 7. 
- 
The second cut is done to a rod of length 6 (i.e., the second part of the first cut), the third is done to a rod of length 4 and the last cut is to a rod of length 3. 
- 
The total cost is 7 + 6 + 4 + 3 = 20. 
- 
Rearranging the cuts to be [3, 5, 1, 4] for example will lead to a scenario with total cost = 16 (as shown in the example photo 7 + 4 + 3 + 2 = 16). 
Constraints​
- 2 <= n<= 10^6
- 1 <= cuts.length<= min(n- 1, 100)
- 1 <= cuts[i]<=n- 1
- All the integers in the cutsarray are distinct.
Solution​
Intuition​
- Sort the cuts in ascending order.
- Use dynamic programming to minimize the cost of cuts.
- Define dp[i][j]as the minimum cost to cut the stick between cuts[i-1] and cuts[j-1].
- Use a bottom-up approach to solve the subproblems and combine them to get the final result.
Time Complexity and Space Complexity Analysis​
- 
Initialization: - Sorting the cuts array takes time, where m is the number of cuts.
- Initializing the dparray takes time.
- Overall initialization time complexity is .
 
- 
DP Table Calculation: - Filling the dptable involves iterating over all possible subintervals and calculating the minimum cost for each subinterval using nested loops.
- This takes time in the worst case.
 
- Filling the 
- 
Overall Time Complexity: - The overall time complexity is .
 
- 
Space Complexity: - The dptable requires space.
- The space complexity is .
 
- The 
Code​
C++​
class Solution {
public:
    int minCost(int n, std::vector<int>& cuts) {
        std::sort(cuts.begin(), cuts.end());
        int m = cuts.size();
        std::vector<std::vector<int>> dp(m + 2, std::vector<int>(m + 2, 0));
        for (int l = 2; l <= m + 1; l++) {
            for (int i = 0; i + l <= m + 1; i++) {
                int j = i + l;
                dp[i][j] = INT_MAX;
                for (int k = i + 1; k < j; k++) {
                    dp[i][j] = std::min(dp[i][j], dp[i][k] + dp[k][j]);
                }
                int left = (i == 0) ? 0 : cuts[i - 1];
                int right = (j == m + 1) ? n : cuts[j - 1];
                dp[i][j] += right - left;
            }
        }
        return dp[0][m + 1];
    }
};