此題的總結:
求解 最大爆破值, 是一個 倒序 二分法問題,最終的原子結構是連續的三個數。
連續的三個數,能夠 往上遞推 間隔一個數的三個數,間隔n個數的三個數
特色在於:每一次遞推,都有可能改變當前槽位值,由於,i,j不變,因爲間隔變化,變得是取得間隔點。
局部最優公式: dpi=max(dpi,nums[i] nums[center]nums[j]+dpi+dpcenter)
應用: 推理,後面的依賴於前面的,能夠用二分法。 三個變量的dp,須要考慮迭代自身位置的值,只用兩個索引。
此模型的特殊性: 相鄰的三個值能夠獲得一個爆破值, 相鄰的兩個值至關於沒有值,賦予0. 類比:二分法求極值。 經過二分肯定具體的位置。 此處 二分肯定肯定以前的最大爆破值。 二分法求極值的兩個值想等。 邊界值:長度不知足要求,說明不在計量範圍內,能夠賦予0. 編輯距離:從前到後,遍歷,依次求最小的移動距離。 此處 二分法到極值是三個連續的數,從相鄰三個數的固定值,逐次放寬範圍,肯定愈來愈寬的爆破值。 總結:dp的應用,相鄰做爲局部,跳躍位置做爲局部
class Solution(object): def maxCoins(self, nums): """ :type nums: List[int] :rtype: int """ assert isinstance(nums,list) nums.insert(0,1) nums.append(1) # row=[0]*len(nums) length=len(nums) max_coins=[[0]*length for _ in range(length)] # print(nums) # print(max_coins) for k in range(2,length): for index_i,i in enumerate(nums[:length-k]): index_j=index_i+k # print(index_i,index_j) for i in range(index_i+1,index_j): elem1=max_coins[index_i][index_j] print(index_i,i,index_j) elem2=max_coins[index_i][i]+max_coins[i][index_j]+nums[index_i]*nums[i]*nums[index_j] max_coins[index_i][index_j]=max(elem1,elem2) # print(max_coins) return max_coins[0][-1] if __name__=='__main__': st=Solution() input_list=[3, 1, 5, 8] out=st.maxCoins(input_list) print(out)