# 1547. Minimum Cost to Cut a Stick
###### tags: `Leetcode` `Hard` `Dynamic Programming`
Link: https://leetcode.com/problems/minimum-cost-to-cut-a-stick/
## 思路
这是一道典型的区间型的DP。对于[i,j]这段区间,我们考虑如何砍下第一刀?显然下刀的位置可以是cuts[i+1],cuts[i+2],...,cuts[j-1]。我们假设在位置k下刀,那么这一刀的代价就是[i,j]的程度,接下来问题就转为了两个小区间[i,k]和[k,j]的问题。所以状态转移方程是:
```dp[i][j] = min{dp[i][k]+dp[k][j]+cuts[j]-cuts[i]} for k=i+1,i+2,...,j-1```
边界条件是对于任何长度为1的区间[i,i+1],不需要下刀,代价就是0.
## Code
```java=
class Solution {
public int minCost(int n, int[] cuts) {
Arrays.sort(cuts);
int m = cuts.length;
int[] arr = new int[m+2];
arr[m+1] = n;
for(int i=0; i<m; i++) arr[i+1] = cuts[i];
int[][] dp = new int[m+2][m+2];
for(int len=3; len<=m+2; len++){
for(int i=0; i+len-1<=m+1; i++){
int j = i+len-1;
dp[i][j] = Integer.MAX_VALUE;
for(int k=i+1; k<=j-1; k++){
dp[i][j] = Math.min(dp[i][j], arr[j]-arr[i]+dp[i][k]+dp[k][j]);
}
}
}
return dp[0][m+1];
}
}
```