动态规划+记忆化
先举例以更好地理解[start,end]
2 无需判断
2,3,4 或者2,3 只需判断一次3即可(end-1)
2,3,4,5 或者2,3,4,5,6 前者要2,4(end-3,end-1) 后者3,5(end-3,end-1)
2,3,4,5,6,7 或者2,3,4,5,6,7,8 前者判断max((4,6),(2,4)) 后者max((3,5),(5,7))此时失去一般性要用循环遍历实现判断左右最大值,也可以认为是(end-3,end-1)这种情况
想继续优化的话就照着这样继续推断下去
class Solution:
def getMoneyAmount(self, n):
"""
:type n: int
:rtype: int
"""
memo=[[0]*(n+1) for i in range(n+1)]
def help(start,end):
if start>= end: return 0
elif memo[start][end] > 0: return memo[start][end]
elif end-start<=2:
memo[start][end]=end-1
return memo[start][end]
elif end-start<=6: #或<=4
memo[start][end]=end-1+end-3
return memo[start][end]
else:
mid=(start+end)//2
res=2**31-1
while mid<end:
tmp=mid+max(help(start,mid-1),help(mid+1,end))
res=min(res,tmp)
mid+=1
memo[start][end]=res
return memo[start][end]
return help(1,n)