368. 最大整除子集(dp)
难度中等
给你一个由 无重复 正整数组成的集合
nums
,请你找出并返回其中最大的整除子集 answer
,子集中每一元素对 (answer[i], answer[j])
都应当满足:
answer[i] % answer[j] == 0
,或answer[j] % answer[i] == 0
如果存在多个有效解子集,返回其中任何一个均可。
示例 1:
输入:nums = [1,2,3] 输出:[1,2] 解释:[1,3] 也会被视为正确答案。
示例 2:
输入:nums = [1,2,4,8] 输出:[1,2,4,8]
提示:
1 <= nums.length <= 1000
1 <= nums[i] <= 2 * 109
nums
中的所有整数 互不相同
class Solution { public: vector<int> largestDivisibleSubset(vector<int>& nums) { sort(nums.begin(),nums.end()); vector<int> dp (nums.size(),1); vector<int> path (nums.size(),0); for(int i = 0;i < nums.size();i++) { for(int j = 0;j < i;j++) { if (nums[i]%nums[j]==0) { //dp[i] = max(dp[i],dp[j]+1); if (dp[j]+1>dp[i]) { dp[i] = dp[j]+1; path[i] = j; } } } } int max_id = max_element(dp.begin(),dp.end()) - dp.begin(); int max_len = dp[max_id]; vector<int> res; while(res.size() != max_len) { res.emplace_back(nums[max_id]); max_id = path[max_id]; } return res; } };