题意
给一个set,要求找出这个set里面一个最大的子集,要求这个子集满足:子集中任意两个元素x, y, x%y==0 或 y%x==0 。
思路
首先,该题基于这样一个事实:若
b%a==0
且
c%b==0
,那么
c%a==0
。
然后,先排序,然后就会发现其实就是LIS问题,只不过限制条件不再是大于而是%。
代码
const int maxn = 100000 + 5;
int d[maxn], p[maxn];
class Solution {
public:
vector<int> ans;
vector<int> largestDivisibleSubset(vector<int>& nums) {
ans.clear();
int n = nums.size();
if (n == 0) return ans;
sort(nums.begin(), nums.end());
d[0] = 1;
memset(p, -1, sizeof(p));
for (int i = 1; i < n; i++) {
d[i] = 1;
for (int j = i - 1; j >= 0; j--) {
if (nums[i] % nums[j] == 0) {
if (d[j] + 1 > d[i]) {
d[i] = d[j] + 1;
p[i] = j;
}
}
}
}
int res = 0, ed = 0;
for (int i = 0; i < n; i++) {
if (d[i] > res) {
res = d[i];
ed = i;
}
}
for (int i = ed; i != -1; i = p[i]) ans.push_back(nums[i]);
return ans;
}
};