LintCode-最大整除子集-動(dòng)態(tài)規(guī)劃

描述

給一個(gè)由 無(wú)重復(fù)的正整數(shù) 組成的集合,找出滿足任意兩個(gè)元素 (Si, Sj) 都有 Si % Sj = 0 或 Sj % Si = 0 成立的最大子集

如果有多種解集,返回其中任意一個(gè)。

樣例

給一個(gè)數(shù)組 [1,2,3],返回 [1,2] 或 [1,3]
給一個(gè)數(shù)組 [1,2,4,8],返回 [1,2,4,8]

代碼

class Solution:
    """
    @param: nums: a set of distinct positive integers
    @return: the largest subset 
    """
    def largestDivisibleSubset(self, nums):
        # write your code here
        nums.sort()
        n = len(nums)
        dp = [1 for i in range(n)]
        dp_index = [-1 for i in range(n)]
        for i in range(1, n):
            max_sum = 0
            for j in range(0, i):
                if nums[i]%nums[j] == 0 and dp[j] > max_sum:
                    max_sum = dp[j]
                    dp_index[i] = j
            dp[i] += max_sum
        sta = 0
        maxL = 0
        for key, val in enumerate(dp):
            if val > maxL:
                maxL = val
                sta = key
        result = []
        while sta>=0:
            result.append(nums[sta])
            sta = dp_index[sta]
        return result
            

思路

思路比較簡(jiǎn)易,就是最長(zhǎng)上升子序列,只不過之前的大小比較條件變化為了整除。但是值得注意的是,它要返回的不是最大整除序列的長(zhǎng)度,而是序列數(shù)組,所以需要記錄。兩種思路,一種是用二維數(shù)據(jù)dp[i][j]直接把數(shù)組記錄下來(lái),dp[i]里存最大的那個(gè)數(shù)組,感覺比較麻煩,第二種就比較簡(jiǎn)單,因?yàn)樾蛄兄g是有連接關(guān)系的,所有用dp_index[i]數(shù)組來(lái)存下標(biāo),dp_index[i]就代表當(dāng)前數(shù)之前的最大整除數(shù)序列的最后一個(gè)數(shù)的下標(biāo),這樣最后在dp[i]中最大的那個(gè)數(shù)的下標(biāo)就是遍歷dp_index[i]下標(biāo)的起始位置。最后把遍歷的下標(biāo)對(duì)應(yīng)的數(shù)返回就好。

題目來(lái)源

https://www.lintcode.com/problem/largest-divisible-subset/description

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 算法思想貪心思想雙指針排序快速選擇堆排序桶排序荷蘭國(guó)旗問題二分查找搜索BFSDFSBacktracking分治動(dòng)態(tài)...
    第六象限閱讀 4,902評(píng)論 0 0
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,923評(píng)論 0 33
  • 動(dòng)態(tài)規(guī)劃(Dynamic Programming) 本文包括: 動(dòng)態(tài)規(guī)劃定義 狀態(tài)轉(zhuǎn)移方程 動(dòng)態(tài)規(guī)劃算法步驟 最長(zhǎng)...
    廖少少閱讀 3,654評(píng)論 0 18
  • 武漢在經(jīng)過了長(zhǎng)時(shí)間的雨水沖刷之后,終于迎來(lái)了太陽(yáng),氣溫驟升,真是讓人沒有一點(diǎn)點(diǎn)防備,而我就成了倒在高溫魔爪下的“幸...
    陽(yáng)春白雪閱讀 107評(píng)論 0 0
  • 2018年5月26日-28日,從“西出陽(yáng)關(guān)無(wú)故人”到“春風(fēng)不度玉門關(guān)”,三天四夜走了77公里。我并不想說(shuō)其中的艱辛...
    星熠美麗說(shuō)閱讀 1,634評(píng)論 2 15

友情鏈接更多精彩內(nèi)容