题目
https://leetcode.com/problems/largest-divisible-subset/
哎,动态规划对我来说仍然是玄学…
只要有动态规划,medium is harder than hard
只要没有动态规划,hard is easier than medium
题解
动态规划问题,没想出来,看了答案。
另外,相似问题:leetcode 300. Longest Increasing Subsequence | 300. 最长递增子序列(动态规划)
本题解参考:【宫水三叶の相信科学系列】详解为何能转换为序列 DP 问题
class Solution {
public List<Integer> largestDivisibleSubset(int[] nums) {
Arrays.sort(nums);
int[] dp = new int[nums.length];
int[] trace = new int[nums.length];
for (int i = 0; i < dp.length; i++) {
dp[i] = 1;
for (int j = 0; j < i; j++) {
if (nums[i] % nums[j] == 0 && dp[j] + 1 > dp[i]) {
dp[i] = dp[j] + 1;
trace[i] = j;
}
}
if (dp[i] == 1) trace[i] = -1;
}
int maxLength = 0;
int maxIndex = 0;
for (int i = 0; i < dp.length; i++) {
if (dp[i] > maxLength) {
maxLength = dp[i];
maxIndex = i;
}
}
ArrayList<Integer> list = new ArrayList<>();
int p = maxIndex;
while (p != -1) {
list.add(nums[p]);
p = trace[p];
}
return list;
}
}