leetcode 368

思路:

   首先想到是排序,因为题目说si%sj ==0 或者 sj%si==0,为了方便,可以升序排序,之后就可以只判断 si%sj(i>=j)就可以了

   dp[i] 表示0~i满足题目要求(也就是,每对数都可以整除)的最大集合。

   dp状态方程式:

         初始化dp[0...len] = 1;

         if(nums[i]%nums[j]==0)    dp[i] = max(dp[j]+1)   (0<j<i)

代码如下:(代码中添加了逆序,但实际上是不需要的,因为题目要求是求一个最大集合

//
//  main.cpp
//  leetcode 368
//
//  Created by jzc on 2018/5/22.
//  Copyright © 2018年 jzc. All rights reserved.
//

#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> largestDivisibleSubset(vector<int>& nums) {
    sort(nums.begin(),nums.end());
    vector<int> result;
    vector<int> dp(nums.size(),1);//表示前j个最大集合
    vector<int> temp;
    for(int i=0;i<nums.size();i++)
    {
        int max =1;
        int k =i;
        for(int j=0;j<i;j++)
        {
            if(nums[i]%nums[j]==0)
            {
                if(dp[j]+1>max)
                {
                    max = dp[j]+1;
                    k = j;
                }
            }
        }
        dp[i] =max;
        temp.push_back(k);
    }
    int max_len = 0;
    int max_pos = 0;
    for(int i=0;i<nums.size();i++)
    {
        if(dp[i]>max_len)
        {
            max_len = dp[i];
            max_pos = i;
        }
    }
    int pos=max_pos;
    while(pos>=0)
    {
        result.push_back(nums[pos]);
        int pre = pos;
        pos = temp[pos];
        if(pre==pos)
            break;
    }
    reverse(result.begin(),result.end());
    for(int i=0;i<result.size();i++)
        cout<<result[i]<<endl;
    return result;
}
int main() {
    int a[6] = {2,3,2,4,4,8};
    vector<int> nums(a,a+6);
    largestDivisibleSubset(nums);
    return 0;
}

 

posted @ 2018-05-22 20:33  Cheney_1016  阅读(173)  评论(0编辑  收藏  举报