func largestDivisibleSubset(nums []int) (res []int) { n := len(nums) if n <= 1 { return nums } sort.Sort(sort.Reverse(sort.IntSlice(nums))) dp, adj := make([]int, n), make([]int, n) for i := 0; i < n; i++ { dp[i], adj[i] = 1, -1 } max, idx := 0, 0 for i := 1; i < n; i++ { // DP + math for j := 0; j < i; j++ { if nums[j]%nums[i] != 0 { continue } if dp[i] < dp[j]+1 { dp[i], adj[i] = dp[j]+1, j } if max < dp[i] { max, idx = dp[i], i } } } for adj[idx] != -1 { res = append(res, nums[idx]) idx = adj[idx] } return append(res, nums[idx]) }