【每日一题Day243】LC1595连通两组点的最小成本 | 状态压缩dp

简介: 【每日一题Day243】LC1595连通两组点的最小成本 | 状态压缩dp

连通两组点的最小成本【LC1595】

给你两组点,其中第一组中有 size1 个点,第二组中有 size2 个点,且 size1 >= size2

任意两点间的连接成本 cost 由大小为 size1 x size2 矩阵给出,其中 cost[i][j] 是第一组中的点 i 和第二组中的点 j 的连接成本。**如果两个组中的每个点都与另一组中的一个或多个点连接,则称这两组点是连通的。**换言之,第一组中的每个点必须至少与第二组中的一个点连接,且第二组中的每个点必须至少与第一组中的一个点连接。

返回连通两组点所需的最小成本。

猛练状态压缩dp

dfs+回溯

  • 思路
    每个点都需要跟另一个组的至少一个点连接,计算最小成本。那么我们可以枚举第一组第i  个点与第2组哪个点连接。【先只保证第一组跟第二组中一个点连接,如果第二组有点没有连接,再将其和最小成本的点连接】。记录第二组点的连接状态,使用状态压缩dp解决。


实现

class Solution {
    int n, m;
    int[][] memo;
    int[] minCost;
    List<List<Integer>> cost;
    public int connectTwoGroups(List<List<Integer>> cost) {
        this.n = cost.size();
        this.m = cost.get(0).size();
        this.memo = new int[n][1 << m];
        this.minCost = new int[m];
        this.cost = cost;
        Arrays.fill(minCost, Integer.MAX_VALUE);
        for (int i = 0; i < n; i++){
            Arrays.fill(memo[i], -1);
        }
        for (List<Integer> c : cost){
            for (int i = 0; i < m; i++){
                minCost[i] = Math.min(minCost[i], c.get(i));
            }
        }
        return dfs(n - 1, 0);
    }
    public int dfs(int i, int mask){
        if (i < 0){// 寻找第二组未连接的点,将其与第一组中最小成本的点连接
            int res = 0;
            for (int j = 0; j < m; j++){
                if (((mask >> j) & 1) == 0){
                    res += minCost[j];
                }
            }
            return res;
        }
        if (memo[i][mask] != -1) return memo[i][mask];
        int res = Integer.MAX_VALUE;
        // 枚举第一组第i个点与第2组哪个点连接【先只保证第一组跟第二组中一个点连接,如果第二组有点没有连接,再将其和最小成本的点连接】
        for (int j = 0; j < m; j++){
            res = Math.min(res, dfs(i - 1, mask | (1 << j)) + cost.get(i).get(j)) ;
        }
        return memo[i][mask] = res;
    }
}

image.png

class Solution {
    public int connectTwoGroups(List<List<Integer>> cost) {
        int n = cost.size(), m = cost.get(0).size();
        var minCost = new int[m];
        Arrays.fill(minCost, Integer.MAX_VALUE);
        for (int j = 0; j < m; j++)
            for (var c : cost)
                minCost[j] = Math.min(minCost[j], c.get(j));
        var f = new int[n + 1][1 << m];
        for (int j = 0; j < 1 << m; j++)
            for (int k = 0; k < m; k++)
                if ((j >> k & 1) == 1) // 第二组的点 k 未连接
                    f[0][j] += minCost[k]; // 去第一组找个成本最小的点连接
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < 1 << m; j++) {
                int res = Integer.MAX_VALUE;
                for (int k = 0; k < m; k++) // 第一组的点 i 与第二组的点 k
                    res = Math.min(res, f[i][j & ~(1 << k)] + cost.get(i).get(k));
                f[i + 1][j] = res;
            }
        }
        return f[n][(1 << m) - 1];
    }
}
作者:灵茶山艾府
链接:https://leetcode.cn/problems/minimum-cost-to-connect-two-groups-of-points/solutions/2314687/jiao-ni-yi-bu-bu-si-kao-dong-tai-gui-hua-djxq/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

image.png

目录
相关文章
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
11月前
|
关系型数据库 OLAP OLTP
深入剖析 OALP 与 OLTP:概念、区别、技术、场景
本文深入剖析了OLTP(在线事务处理)与OLAP(在线分析处理)的概念、区别、技术及应用场景。OLTP专注于实时业务操作,确保数据一致性和高效性,适用于金融、电商等行业;OLAP则侧重于历史数据分析,支持复杂查询和多维分析,助力企业决策。两者在数据特点、系统设计、用户类型及数据库设计上存在显著差异。合理结合OLTP和OLAP,可提升企业的运营效率和决策水平。
1930 15
|
机器学习/深度学习 人工智能 自然语言处理
评测:AI 大模型助力客户对话分析
该评测报告详细介绍了Al大模型在客户对话分析中的应用,涵盖了实践原理、实施方法、部署体验、示例代码及业务适应性。报告指出,该方案利用NLP和机器学习技术,深度解析对话内容,精准识别用户意图,显著提升服务质量与客户体验。实施方法清晰明了,文档详尽,部署体验顺畅,提供了丰富的引导和支持。示例代码实用性强,但在依赖库安装和资源限制方面需注意调整。整体上,该方案能够满足基本对话分析需求,但在特定行业场景中还需进一步定制化开发。
使用LabVIEW打开默认应用程序中的文档(PDF,Word,Excel,Html)
使用LabVIEW的&quot;Open a Document on Disk.vi&quot;,存于&lt;LabVIEW&gt;\vi.lib\Platform\browser.llb,可让默认应用打开硬盘文档。此VI仅基础打开功能,高级控制推荐LabVIEW Report Generation Toolkit或ActiveX。注意:避免版本升级问题,最好将VI复制到vi.lib外的目录。
614 3
|
Oracle 关系型数据库 Java
java操作多数据源将oracle数据同步达梦数据库
java操作多数据源将oracle数据同步达梦数据库
|
数据安全/隐私保护
BUUCTF---[SWPU2019]神奇的二维码
BUUCTF---[SWPU2019]神奇的二维码
|
机器学习/深度学习 人工智能 分布式计算
人工智能平台PAI
人工智能平台PAI
776 0
|
缓存 搜索推荐 算法
Java排序实战:如何高效实现电商产品排序
在当今的数字化时代,电子商务已成为人们日常生活的重要组成部分。消费者可以在电商平台上浏览和购买来自全球的商品,这无疑为我们的生活带来了极大的便利。然而,随着电商平台的规模不断扩大,商品数量的急剧增加,如何对海量商品进行高效排序成为了电商系统开发的一大挑战。
|
机器学习/深度学习 人工智能 自然语言处理
巧用ChatGPT高效搞定Excel数据分析
随着人工智能技术的不断发展,越来越多的企业开始将其应用于办公场景,以提高员工的工作效率。而在众多办公软件中,Excel无疑是最常用的一款。然而,传统的Excel数据分析方法往往耗时且容易出错。
1364 0