这道题和找最长子序列有点像
排序
动态规划找到最长的整除子集,但是要记录前一个数位置
举个例子 [1,2,3]
我们用dp[i]记录到i最长的整除子集长度,用pre[i]记录到i前面一个数的位置
class Solution {
public:
int dp[1000];
int pre[1000];
int maxi=0;
int maxlen=1;
vector<int> largestDivisibleSubset(vector<int>& nums) {
int n=nums.size();
if(n==0)
return {};
sort(nums.begin(),nums.end());
for(int i=0;i<n;i++){
dp[i]=1;
pre[i]=-1;
for(int j=i-1;j>=0;j--)
if(nums[i]%nums[j]==0&&dp[j]+1>dp[i]){ //判断是否整除前面一个
dp[i]=dp[j]+1;
pre[i]=j;
}
if(dp[i]>maxlen){
maxlen=dp[i];
maxi=i;
}
}
vector<int>ans;
while(maxi!=-1){
ans.push_back(nums[maxi]);
maxi=pre[maxi];
}
reverse(ans.begin(),ans.end());
return ans;
}
};
参考题解:https://leetcode-cn.com/problems/largest-divisible-subset/comments/