368. Largest Divisible Subset

来源:互联网 发布:辫子戏 知乎 编辑:程序博客网 时间:2024/05/17 07:23

Difficulty: Medium


Given a set of distinct positive integers, find the largest subset such that every pair (Si, Sj) of elements in this subset satisfies: Si % Sj = 0 or Sj % Si = 0.

If there are multiple solutions, return any subset is fine.

Example 1:

nums: [1,2,3]Result: [1,2] (of course, [1,3] will also be ok)

Example 2:

nums: [1,2,4,8]Result: [1,2,4,8]

class Solution {public:    vector<int> largestDivisibleSubset(vector<int>& nums) {        int size=nums.size();        if(size==0) return nums;        sort(nums.begin(), nums.end());        vector<int> dp(size, 1);        vector<int> pre(size, -1);        int max=0, index=0;        for(int i=0; i<size-1; i++)            for(int j=i+1; j<size; j++){                if((nums[j]%nums[i]==0) && (dp[i]+1>dp[j])){                    dp[j]=dp[i]+1;                    pre[j]=i;                }                if(dp[j]>max){                    max=dp[j];                    index=j;                }            }        vector<int> ans;        while(index!=-1){            ans.push_back(nums[index]);            index=pre[index];        }        sort(ans.begin(), ans.end());        return ans;    }};

dp: 以nums[n]为结尾的largest division subset是最长的以nums[i]结尾的largest division subset加上nums[n],其中nums[n]能被nums[i]整除。若不存在这样的nums[i],那么以nums[n]为结尾的largest division subset就是它自己。

      dp[n]=max{dp[i]+1 | n%i==0}

用数组pre[j]记录序列中nums[j]的前一个数。


0 0