看题解
根据传递性,如果我能除以一个整除子集中的最大,那么其他所有的我都可以整除。
f[i]表示以下标i结尾的中的最长,g记录着每步的转移,g[i]=j,即这个序列走到i时候是有以j为结尾的整除子集转移而来的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| class Solution { public: vector<int> largestDivisibleSubset(vector<int>& nums) { sort(nums.begin(), nums.end()); int n = nums.size(); vector<int> f(n); vector<int> g(n); int maxSize = 1; int idx = 0; for(int i = 0; i < n; ++i) { int len = 1, prev = i; for(int j = 0; j < i; ++j) { if(nums[i] % nums[j] == 0 && f[j] + 1 > len) { len = f[j] + 1; prev = j; } } if(len > maxSize) { maxSize = len; idx = i; } f[i] = len; g[i] = prev; } vector<int> ret; for(int i = 0; i < maxSize; ++i) { ret.push_back(nums[idx]); idx = g[idx]; } return ret; } };
|