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; }