原题:
力扣
思路:动态规划+记忆化搜索
灵感:
代码:
package 算法.动态规划.leetcode;
import java.util.*;
/**
* 并查集
*/
public class leetcode368 {
public static void main(String[] args) {
int[] nums = {1,2,3,4,6,12,24};
List<Integer> list = largestDivisibleSubset(nums);
}
public static List<Integer> largestDivisibleSubset(int[] nums) {
//先排序
Arrays.sort(nums);
Map<String,List<Integer>> map = new HashMap<>();
//动态规划得出结果
List<Integer> list = getList(nums,nums.length-1,nums.length-2,map);
//补丁 不想想了
if(nums[nums.length-1] % nums[nums.length-2] == 0){
list.add(nums[nums.length-1]);
}
//返回
return list;
}
/**
*
* @param nums
* @param i 大 数
* j 小树
* @return
*/
private static List<Integer> getList(int[] nums, int i, int j, Map<String,List<Integer>> map) {
//说明已经没有了
if (j == -1||i==0) {
return new ArrayList<>();
}
//记忆化搜索
StringBuilder key = new StringBuilder();
key.append(i);
key.append(j);
if (map.containsKey(key.toString())) {
List<Integer> old = new ArrayList<>();
old.addAll(map.get(key.toString()));
return old;
}
List<Integer> one = new ArrayList<>();
List<Integer> two = new ArrayList<>();
//如果能除开就继续找,否则下一个数
if(nums[i] % nums[j] == 0){
one = getList(nums,j,j-1,map);
one.add(nums[j]);
}
two = getList(nums,i,j-1,map);
one = one.size()> two.size()? one:two;
List<Integer> newList = new ArrayList<>();
newList.addAll(one);
//记忆化搜索
map.put(key.toString(),newList);
return one;
}
}