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]的前一个数。