这道题目是二刷了,还是没有印象。
总结不到位导致的问题出现。
这道题目和之前的354. Russian Doll Envelopes 俄罗斯套娃,leetcode 300 一样的题型。
属于接龙问题。
思路也是相似的,固定好i 以后,遍历j从0到i-1.
然后寻找dp[j]+1的最大值。
并且用prev数组去记录前序节点。
代码如下:
class Solution {
public:
vector<int> largestDivisibleSubset(vector<int>& nums) {
// DP 的状态为当前位置的divisible 个数。这道题和最长LIS一样的想法。
// 用prev数组来记录前序节点的位置。
// DP地推公式是从当前位置往前找,找到第一个比他小并且可以被整除的个数。
// DP[i] = DP[j] + 1
int n=nums.size();
sort(nums.begin(), nums.end());
vector<int> dp(n, 1);
vector<int> prev(n, -1);
for(int i = 1;i<n;i++){
for(int j = i-1;j>=0;j--){
if(nums[i] > nums[j] && nums[i]%nums[j] ==0)
if(dp[i] < dp[j] + 1){
dp[i] = dp[j] + 1;
prev[i] = j;
}
}
}
int m =0;
int maxIndex=0;
for(int i =0;i<n;i++){
if(dp[i] > m){
m = dp[i];
maxIndex = i;
}
}
vector<int> ret;
while(maxIndex !=-1){
ret.push_back(nums[maxIndex]);
maxIndex = prev[maxIndex];
}
return ret;
}
};
想不明白为啥不长记性!!!这个问题值得深思。