leetcode368

dp

因爲一開始的數一定是後面的某幾個數的因子,相當於從一個點發散了多條路徑,因此要記住上一點是誰

class Solution {
public:
    vector<int> largestDivisibleSubset(vector<int>& nums) {
        vector<int>ans;
        if(nums.size() == 0) return ans;
        
        vector<int>dp(nums.size(),1);
        vector<int>index(nums.size(),0);
        sort(nums.begin(),nums.end());
        
        int Max = 0;
        int MaxIndex = 0;
        
        for(int i = 0;i<nums.size();i++) index[i] = i;
        
        for(int i = 1;i<nums.size();i++)
        {
            for(int j = 0;j<i;j++)
            {
                if(nums[i]%nums[j] == 0)
                {
                    if(dp[i] < dp[j]+1)
                    {
                       dp[i] = dp[j]+1; 
                       index[i] = j;
                    }
                }
            }
            if(dp[i] > Max)
            {
                Max = dp[i];
                MaxIndex = i;
            }
        }
        
        do
        {
            ans.push_back(nums[MaxIndex]);
            if(MaxIndex == index[MaxIndex]) break;
            MaxIndex = index[MaxIndex];
        }while(1);
            
        return ans;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章