由于题目保证元素唯一,且没有顺序,因此我们对数组进行排序,就会发现,如果满足要求,那么数组一定就是等比数列,即具有传递性,因此思路和最长上升子序列的思路是一样的。这里要输出方案数,所以需要倒退一遍,这里倒推到第一个元素的条件是f[k] = 1;
class Solution {
public:
vector<int> largestDivisibleSubset(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n = nums.size();
vector<int> res;
if(n == 0){
return res;
}
vector<int> f(n, 1);
int maxLen = 0;
int k = 0;
for(int j = 1; j < n; j++){
for(int i = 0; i < j; i++){
if(nums[j] % nums[i] == 0){
f[j] = max(f[j], f[i] + 1);
}
}
if(f[j] > maxLen){
k = j;
maxLen = f[j];
}
}
res.push_back(nums[k]);
while(f[k] > 1){
for(int i = 0; i < k; i++){
if((nums[k] % nums[i] == 0 ) && (f[k] == f[i] + 1)){
res.push_back(nums[i]);
k = i;
break;
}
}
}
return res;
}
};