★☆★lc 1000. Minimum Cost to Merge Stones

https://leetcode.com/problems/minimum-cost-to-merge-stones/

这个题真是巨骚无比。不对着错误样例debug,自己压根不知道这题水有多深。

1.处理cost的求和方式

2.分段dp?不分段?分段?不分段?分段?不分段?晕了。

事实证明hulu19年的第四题那种相互依赖的双重dp辅助真的是有效的面向人脑理解的方式。

事实证明我们需要一个分段数量来辅助构造,或者dfs穷举答案,就不用这个状态了,但是dfs比较难写,需要上下文配合。所以我们使用了这个段数状态m。

再精巧的思想也就是几行代码的事

 

代码:

class Solution:
    def mergeStones(self,ns,k):
        dp={}
        mn=sum(ns)*len(ns)

        def getm(l,r,m):
            if m==1:
                m=k
            if l==r:
                if m==k:
                    return 0
                return mn

            lrm=(l,r,m)
            if lrm in dp:
                return dp[lrm]

            ans=mn
            for i in range(l,r,k-1):
                ll=getm(l,i,1)
                rr=getm(i+1,r,m-1)
                x=ll+rr
                ans=min(ans,x)
            ans+=0 if m!=k else sum(ns[l:r+1])
            dp[lrm]=ans
            return ans

        if k!=2 and len(ns)%(k-1)!=1:
            return -1
        x=getm(0,len(ns)-1,k)
        return x

 

posted @ 2019-09-22 00:59  Cloud.9  阅读(193)  评论(0编辑  收藏  举报