思路:其实和最长上升子序列的思路基本一致。
dp[i]表示以nums[i]结尾的最大的整数子集。dp[i]=max(dp[j]+1,dp[i]) 其中nums[j]%nums[i]==0||nums[i]%nums[j]==0
为了避免6 2 4 这样的序列出现,只需先对nums进行一下排序即可。
需要输出子集,那么只要开一个path数组,记录一下路径即可。
class Solution {
public:
vector<int> largestDivisibleSubset(vector<int>& nums) {
int n=nums.size();
vector<int> vec;
if(n<1) return vec;
int dp[n+1];
int path[n+1];
sort(nums.begin(),nums.end());
dp[0]=0;
for(int j=1;j<=n;j++){
path[j]=j;
dp[j]=1;
}
int index=0;
int M=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<i;j++)
{
if(nums[i-1]%nums[j-1]==0||nums[j-1]%nums[i-1]==0)
{
if(dp[j]+1>dp[i]){
path[i]=j;
}
dp[i]=max(dp[j]+1,dp[i]);
}
}
if(dp[i]>M)
{
M=dp[i];
index=i;
}
}
vec.push_back(nums[index-1]);
while(path[index]!=index)
{
vec.push_back(nums[path[index]-1]);
index=path[index];
}
return vec;
}
};