leetcode-357-Count Numbers with Unique Digits

此題的總結:
求解 最大爆破值, 是一個 倒序 二分法問題,最終的原子結構是連續的三個數。
連續的三個數,能夠 往上遞推 間隔一個數的三個數,間隔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)
相關文章
相關標籤/搜索