zoukankan      html  css  js  c++  java
  • 【leetcode】368. Largest Divisible Subset

    题目如下:

    解题思路:leetcode里面有很多这样类似的题目,本题是求能够整除的,还有求依次递增的,一增一减的等等,都是万变不离其宗。对于这一类题目,我都是采用动态规划的算法。这题怎么解呢?首先对nums按升序排序,然后创建一个dp数组,dp[i]表示从nums[0]~nums[i]区间符合题目条件的子集的最大长度(注意,子集中nums[i]是必定包含的),里面的每个元素赋初始值为1。那个我们很容易可以得到递推表达式:在j = [0,i-1]区间内,得到满足nums[i] % nums[j] 条件的max{dp[j]},那么dp[i] = dp[j] + 1。同时,因为题目要求的不是输出最大长度,而是输出最大子集,因此,再用一个数组记录遍历过程中符合条件的子集即可。

    代码如下:

    class Solution(object):
        def largestDivisibleSubset(self, nums):
            """
            :type nums: List[int]
            :rtype: List[int]
            """
            if len(nums) == 0:
                return []
            nums.sort()
            dp = [1 for i in xrange(len(nums))]
            val = [[i] for i in nums]  #记录所有符合条件的子集
            maxInx = 0
            maxV = 0
            for i, v in enumerate(dp):
                for j in xrange(0, i):
                    if nums[i] % nums[j] == 0:
                        if dp[i] < dp[j] + 1:
                            l = val[j][:]
                            l.append(nums[i])
                            val[i] = l
                            dp[i] = dp[j] + 1
                            if maxV < len(val[i]):
                                maxInx = i
                                maxV = len(val[i])
            return val[maxInx]
  • 相关阅读:
    USACO6.4-The Primes
    ZOJ2112--Dynamic Rankings (动态区间第k大)
    Havel定理
    HDU5107---K-short Problem (线段树区间 合并、第k大)
    POJ2104-- K-th Number(主席树静态区间第k大)
    poj2409 & 2154 polya计数+欧拉函数优化
    CodeForces
    HDU
    HDU
    Gym
  • 原文地址:https://www.cnblogs.com/seyjs/p/8878639.html
Copyright © 2011-2022 走看看