lc 1199. Minimum Time to Build Blocks

简直精妙。

哈夫曼编码?

我用的是dp,这种区间dp的时间复杂度是真的难算!状态转移方程为n的区间dp时间都算作n^3吧。

先把任务从长到短排序,然后看worker在那一层要细分多少?就是位置i和员工数n的dp转移。

 

但是可以贪心!!!!!!!!!!!!每次都是把时间最短的放在最后,而且这两个必然同父,合体后与其他点没有任何差异,继续找最短的合体。

 

 

dp代码(python过不了,c++可以):

class Solution:
    def minBuildTime(self, ns, l) -> int:
        dp={}
        ns.sort(reverse=True)
        mx=l*len(ns)*ns[0]

        def get(i,n):
            if i==len(ns):
                return 0
            if n==0:
                return mx
            lst = len(ns) - i
            if n >= lst:
                return ns[i]
            if  (i,n) in dp:
                return dp[(i,n)]
            ans=max(ns[i],get(i+1,n-1))
            ans=min(ans,l+get(i,n*2))
            dp[(i,n)]=ans
            return ans
        # for i in reversed(range(len(ns))):
        #     lst=len(ns)-i
        #     for j in range(1,lst+1):
        #         get(i,j)
        x=get(0,1)
        return x

 

转载于:https://www.cnblogs.com/waldenlake/p/11565771.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值