题目:1547. 切棍子的最小成本
思路:具有最优子结构问题。考虑第一步,将棍子分成两节后,答案=棍子的长度+新生产的两节棍子的最优答案。
为了简单操作,我们将0和n插入到数组cuts中,升序排序。这样可以枚举从哪个下标分开(这里肯定选不到第一个和最后一个节点,因为这样的话,并没有产生新的棍子。无效操作),最后状态可以表示为sta[i][j]:表示区间为[cuts[i],cuts[j]]的棍子的最优答案。
方法一:动态规划递归版本,时间复杂度为0(m^ 3)。时间复杂度=状态的个数m^2 X 计算每个状态的复杂度0(m)组成。
C++版本:
class Solution {
public:
//参数:l是棍子的左端点、r是棍子的右端点、sta是记忆化数组
int dfs(int l,int r,vector<vector<int>> & sta,vector<int>& cuts){
//表明中间没有可以选的分开下标
if(l+1==r) return 0;
//记忆化
if(sta[l][r]!=-1) return sta[l][r];
//找到最小的成本
int mn=INT_MAX;
for(int k=l+1;k<r;k++){
mn=min(mn,dfs(l,k,sta,cuts)+dfs(k,r,sta,cuts));
}
//记忆化
return sta[l][r]=mn+cuts[r]-cuts[l];
}
int minCost(int n, vector<int>& cuts) {
//将0和n插入到数组cuts中,升序排序
int m=cuts.size();
cuts.