(nice!!!)(LeetCode) 1547. 切棍子的最小成本(动态规划,递归 || 递推)

题目: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.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值