★☆★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