动态规划-最长可互除子序列 Largest Divisible Subset
2018-08-28 17:51:04
问题描述:

问题求解:
本题是一个求最优解的问题,很自然的会想到动态规划来进行解决。但是刚开始还是陷入了僵局,直到看到了hint:LIS,才有了进一步的思路。下面是最初的一个解法。使用的是map来记录信息。
    public List<Integer> largestDivisibleSubset(int[] nums) {
        if (nums.length == 0) return new ArrayList<>();
        Arrays.sort(nums);
        Map<Integer, List<Integer>> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            List<Integer> tmp = null;
            int maxlen = 0;
            for (int j = 0; j < i; j++) {
                if (nums[i] % nums[j] == 0 && maxlen < map.get(nums[j]).size()) {
                    tmp = new ArrayList<>(map.get(nums[j]));
                    maxlen = tmp.size();
                }
            }
            if (tmp == null) tmp = new ArrayList<>();
            tmp.add(nums[i]);
            map.put(nums[i], tmp);
        }
        int maxlen = 0;
        List<Integer> res = null;
        for (Integer i : map.keySet()) {
            if (map.get(i).size() > maxlen) {
                res = map.get(i);
                maxlen = res.size();
            }
        }
        return res;
    }
当然上述的代码效率不是很高,我们可以使用两个数组来进行维护。
    public List<Integer> largestDivisibleSubset(int[] nums) {
        List<Integer> res = new ArrayList<>();
        if (nums.length == 0) return res;
        Arrays.sort(nums);
        int[] dp = new int[nums.length];
        int[] prev = new int[nums.length];
        int max = 0;
        int index = -1;
        for (int i = 0; i < nums.length; i++) {
            prev[i] = -1;
            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;
                    prev[i] = j;
                }
            }
            if (dp[i] > max) {
                max = dp[i];
                index = i;
            }
        }
        while (index != -1) {
            res.add(nums[index]);
            index = prev[index];
        }
        return res;
    }
动态规划-最长可互除子序列 Largest Divisible Subset的更多相关文章
- 【leetcode】368. Largest Divisible Subset
		
题目描述: Given a set of distinct positive integers, find the largest subset such that every pair (Si, S ...
 - Leetcode 368. Largest Divisible Subset
		
Given a set of distinct positive integers, find the largest subset such that every pair (Si, Sj) of ...
 - 【LeetCode】368. Largest Divisible Subset 解题报告(Python)
		
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/largest-d ...
 - [LeetCode] Largest Divisible Subset 最大可整除的子集合
		
Given a set of distinct positive integers, find the largest subset such that every pair (Si, Sj) of ...
 - LeetCode "Largest Divisible Subset" !
		
Very nice DP problem. The key fact of a mutual-divisible subset: if a new number n, is divisible wit ...
 - Largest Divisible Subset
		
Given a set of distinct positive integers, find the largest subset such that every pair (Si, Sj) of ...
 - 368. Largest Divisible Subset -- 找出一个数组使得数组内的数能够两两整除
		
Given a set of distinct positive integers, find the largest subset such that every pair (Si, Sj) of ...
 - [Swift]LeetCode368. 最大整除子集 | Largest Divisible Subset
		
Given a set of distinct positive integers, find the largest subset such that every pair (Si, Sj) of ...
 - Largest Divisible Subset -- LeetCode
		
Given a set of distinct positive integers, find the largest subset such that every pair (Si, Sj) of ...
 
随机推荐
- yii2关联查询两组一对一
			
public function getMember1(){ return $this->hasOne(Member::className(), ['wechat_id' => ...
 - zw版【转发·台湾nvp系列Delphi例程】HALCON SigmaImage2
			
zw版[转发·台湾nvp系列Delphi例程]HALCON SigmaImage2 procedure TForm1.Button1Click(Sender: TObject);var op: HOp ...
 - HDU 1586 log 的运用
			
log函数的应用,因为 log(a^b)=b*log(a); log(a*b)=log(a)+log(b); 比如 log10(123456789)==log10(1.23456789)+8; log ...
 - EditPlus 4.3.2560 中文版已经发布
			
新的版本修复了选中文本操作的一些问题. 下载连接在左上角!
 - python getctime() 文件最后一次的改变时间
			
Return the metadata change time of a file,reported by os.stat() def mm(): file_name=r'c:\temp.txt' f ...
 - quartz-job实现实时或定时发送短信任务
			
存放调度器(Job 和 Trigger)信息的xml配置文件: 这是某个指定的要实现的定时任务: <!-- 每天给项目经理发送短信避免短信服务挂了 定时每天08:30执行--> <j ...
 - 2018-2019-2 20165209 《网络对抗技术》Exp7: 网络欺诈防范
			
2018-2019-2 20165209 <网络对抗技术>Exp7: 网络欺诈防范 1 基础问题回答和实验内容 1.1基础问题回答 (1)通常在什么场景下容易受到DNS spoof攻击. ...
 - IO(File)
			
1. 一个File类的对象,表示了磁盘上的文件或目录 2. File类提供了与平台无关的方法来对磁盘上的文件或目录进行操作 3. File对象可用来获取或处理与磁盘文件相关的信息,如:权限,时间,日期 ...
 - ajax请求头设置 | header 传token
			
$('.w-entry-btn').on('tap',function(){ var urlAddress = '/api/address'; var valToken = JSON.parse(lo ...
 - Linux基础命令---yes
			
yes 反复的输出指定的字符串,直到手动停止.此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法 yes [STR ...