动态规划 --- 电线布设

news2025/1/20 14:50:31

动态规划 — 电线布设

题目描述
在这里插入图片描述

说是话,刚看到也是很懵逼,不想交子集是什么?乱七八糟的连线。

其实仔细想想后,觉得题目应该是说给定了这些点的连接端点,然后从他给的连线中选择出不想交的且条数最多的连线,如下面的例子便是其中的一个最大不相交子集。

在这里插入图片描述

终点数组 end[i] = {0,8,7,4,2,5,1,9,3,10,6};

解决思路,采用动态规划的方式

dp[ i ] [ j ] :表示到达端点i 时,最大不相交子集个数

i :表示 从 1 - N的起点

j :表示 终点

递推式:

当 i == 1时,

如果 j < end[1],当前最大不相交子集为空 dp[ 1 ] [ j ] = 0

如果 j >= end[1],当前最大不相交子集只有一条连线 dp[ 1 ] [ j ] = 1

当 i > 1时,

如果 j < end[i] ,表明当前端点连线还未加入集合 dp[ i ] [ j ] = dp [ i -1 ] [ j ]

如果 j >= end[i],判断当前连线能否加入最大不相交子集 dp [ i ] [ j ] = Math.max(dp [ i - 1 ] [ j ] , dp [i - 1] [ end[ i ] - 1] + 1 )

其实写到dp [ i ] [ j ] = dp [i - 1] [ j ] 还能理解,但是dp [ i ] [ j ] = Math.max(dp [ i - 1 ] [ j ] , dp [i - 1] [ end[ i ] - 1] + 1 ) 怎么去理解?

看这个最终填表图

比较的是左上角 与 从上一行继承下来的值, 与 dp [i - 1] [ end[ i ] - 1] + 1 比较是看 最大不相交集合中 有多少条线与 当前线不相交

填表过程

初始化
在这里插入图片描述

第二行
在这里插入图片描述

第三行

在这里插入图片描述

第四行

在这里插入图片描述

第五行

在这里插入图片描述

第六行

在这里插入图片描述

第七行

在这里插入图片描述

第八行
在这里插入图片描述

第九行
在这里插入图片描述

第十行

在这里插入图片描述

Java代码

public static void main(String[] args) {
    //连线端点
    int[] end = {0,8,7,4,2,5,1,9,3,10,6};
    //i -- > 表示上端点个数  j --> 表示下端点的个数
    //初始化,只有第一个端点时
    /**
         * dp[i][j]
         * i -- > 表示上端点个数  j --> 表示下端点的个数
         * i == 1时
         *    j < end[i] 时
         *      dp[i][j] = 0
         *    j >= end[i]时
         *      dp[i][j] = 1
         * i > 1时
         *    j < end[i] 时  (当前端点代表的线没有被加进集合)
         *      dp[i][j] = dp[i-1][j]
         *    j >= end[i]时  (判断当前端点代表的线是否能够被加进来)
         *      dp[i-1][j] 不能被加进来
         *      dp[i-1][end[i] - 1] + 1 可以被加进来
         *      dp[i][j] = Math.max(dp[i-1][j],dp[i-1][end[i] - 1] + 1);
         */
    int N = end.length;
    int[][] dp = new int[N][N];
    //在第一个端点头尾连起来的时候,连线的个数都是0
    for(int i = 0; i < end[1]; i++){
        dp[1][i] = 0;
    }
    //超过了端点,证明有一个线被加了进来
    for(int i = end[1]; i < N; i++){
        dp[1][i] = 1;
    }
    //最优子结构
    //每一个端点前的最大个数 为 上一个端点的最大个数 + 1
    for(int i = 2; i < N; i++){
        //在到自己连线处时,最大不相交子集为上一个端点存储的值
        System.arraycopy(dp[i - 1], 0, dp[i], 0, end[i]);
        //在到达当前端点时
        for(int j = end[i]; j < N; j++){
            //判断当前点的线能否被加进来
            //加进来 与 不加进来
            dp[i][j] = Math.max(dp[i-1][j], dp[i - 1][end[i] - 1] + 1);
        }

    }
    for(int i = 1; i < N; i++){
        for(int j = 1; j < N; j++){
            System.out.print(dp[i][j] + " ");
        }
        System.out.println();
    }
    
    //根据dp数组获取一种最大不相交子集
    List<Integer> res = new ArrayList<>();
    int j = N - 1;
    for(int i = N - 1; i > 1; i--){
        if(dp[i][j] != dp[i-1][j]){
            res.add(i);
            //换下一个端点
            j = end[i] - 1;
        }
    }
    System.out.println(res);
}
//结果
0 0 0 0 0 0 0 0 1 1 1 
0 0 0 0 0 0 0 1 1 1 1 
0 0 0 0 1 1 1 1 1 1 1 
0 0 1 1 1 1 1 1 1 1 1 
0 0 1 1 1 2 2 2 2 2 2 
0 1 1 1 1 2 2 2 2 2 2 
0 1 1 1 1 2 2 2 2 3 3 
0 1 1 2 2 2 2 2 2 3 3 
0 1 1 2 2 2 2 2 2 3 4 
0 1 1 2 2 2 3 3 3 3 4 
[9, 7, 5, 3]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/469212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flink自定义函数之标量函数(UDF函数)

1.背景 flink本身给我们提供了大量的内置函数&#xff0c;已经能满足我们绝大部分的需求&#xff0c;但是如果确实是碰到了一些特殊的场景&#xff0c;无法满足我们的需求的时候&#xff0c;我们可以使用自定义函数来解决。 自定义函数大致可以分为标量函数&#xff08;UDF函…

Linux-安装Python2.7

一、简介 正常情况下&#xff0c;使用sudo apt install python来安装就好了。如果发现这个指令报错了&#xff0c;此时就需要手动安装Python2.7了。例如报错如下&#xff1a; 二、实操 1.下载Python2.7的相关源码&#xff08;以2.7.18为例&#xff09; 下载地址如下&#xff1a…

Linux第四章

文章目录 前言一、快捷键小技巧二、软件安装三、systemctl控制软件启动关闭四、软链接五、日期和时区六、ip地址和主机名七、配置linux固定ip地址八、网络请求和下载九、端口十、进程管理十一、主机状态监控十二、环境变量十三、linux文件的上传和下载十四、压缩和解压总结 前言…

第五章 使用RAID与LVM磁盘阵列技术

第五章 使用RAID与LVM磁盘阵列技术 一、RAID磁盘冗余阵列 1、部署磁盘阵列 &#xff08;1&#xff09;、RAID0、1、5、10方案技术对比 RAID级别最少硬盘可用容量读写性能安全性特点02nn低追求最大容量和速度&#xff0c;任何一块盘损坏&#xff0c;数据全部异常。12n/2n高追…

魔兽世界服务端用户注册以及网页的搭建教程

魔兽世界服务端用户注册以及网页的搭建教程 大家好我是艾西&#xff0c;上一章我们讲解了怎么编译一个魔兽的服务端以及安装最后进到我们自己的游戏。那么在平时娱乐的同时肯定是需要和朋友们一起玩游戏才会更有意思&#xff0c;那么今天艾西教大家怎么搭建用户注册页面以及网…

java进程引发的内存泄露问题排查分析

近期工作过程中遇到了一次容器内存不断增高&#xff0c;最终达到90%引发告警的情况。 特征1&#xff0c;把监控面板时间轴拉长会发现&#xff0c;重启后内存占用78%左右&#xff0c;每天增长1%&#xff0c;大约2周后会涨到90%触发告警&#xff08;即如果2周内有代码发布部署&am…

2022-04-27:用go语言重写ffmpeg的remuxing.c示例。

2022-04-27&#xff1a;用go语言重写ffmpeg的remuxing.c示例。 答案2022-04-27&#xff1a; ffmpeg的remuxing.c是一个用于将多媒体文件从一种容器格式转换为另一种容器格式的命令行工具。它可以将音频、视频和字幕等元素从源文件中提取出来&#xff0c;并按照用户指定的方式…

构造函数和析构函数

1.构造函数 1.1 .构造函数概括 、构造函数是一个特殊的成员函数&#xff0c;名字与类名相同,创建类类型对象时由编译器自动调用&#xff0c;以保证每个数据成员都有 一个合适的初始值&#xff0c;并且在对象整个生命周期内只调用一次。 构造函数是特殊的成员函数&#xff0c…

简单认识 Postman界面操作

查看本文前 您需要先登录Postman 如果还没有处理好 可以先查看我的文章 Postman登录注册指导 右上角的 Home 代表主页 就是我们现在看到的这个界面 Workspaces 是一个工作空间管理 这里 我们选择进入 我的工作空间 之后 我们所有的接口请求 就都是在这一块完成的 Collection…

ubuntu中安装VMware Tools,实现Windows文件拖入Ubuntu

ubantu作为一款非常好用的Linux发行版本&#xff0c;深受广大开发者的喜爱&#x1f603;&#xff0c;为了开发的方便&#xff0c;人们常常在windows电脑中安装VMware虚拟机来运行Linux系统&#xff0c;我们时常会遇到这样一种情况&#xff1a;无法互传虚拟机与主机文件。 原因就…

终端连接工具Tabby的下载、安装与配置

目录 一、终端连接工具Tabby的下载1.1、Tabby的下载地址1.2、Tabby的下载步骤 二、终端连接工具Tabby的安装三、终端连接工具Tabby的SSH连接四、终端连接工具Tabby的SFTP 传输工具4.1、服务器上的文件传输到本地电脑4.2、本地电脑的文件传输到服务器 五、终端连接工具Tabby的设…

基于网络爬虫和SpringBoot框架的晋江文学小说小型网站项目

一、Python网路爬虫技术的设计与实现 Scrapy是一个为了爬取网站数据&#xff0c;提取结构性数据而编写的应用框架&#xff0c;常可以应用在包括数据挖掘&#xff0c;信息处理或存储历史数据等一系列的程序中。项目中&#xff0c;主要采取Scrapy框架实现一个爬虫&#xff0c;抓…

JavaSE3(4/26)

目录 1.线程的状态 2.线程安全问题 3.synchronized的具体用法 4. 1.线程的状态 首先明白进程的状态:就绪或者阻塞 上述说的就绪和阻塞其实是针对系统中的线程状态(PCB) Java中对于Thread类中的线程的状态进行了进一步的细化 NEW: Thread对象有了,但是线程还没有被执行 TERMI…

RabbitMQ之介绍以及安装

1.1 MQ的相关概念 1.1.1 什么是MQ ​ MQ&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO先入先出&#xff0c;只不过队列中存放的内容是message而已&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递消息。在互联网架构中&#xff0c;MQ…

摄影tips

一、基础知识 相机挡位 A档就是全自动模式或称场景智能自动模式&#xff0c;该拍摄模式下&#xff0c;相机会根据光线和你所拍摄的对象等场景环境自行设置快门、光圈等参数&#xff0c;你不需要调整任何参数&#xff0c;拿起相机对焦按快门就行&#xff0c;也就是AUTO模式。虽…

opengauss编译和使用oracle_fdw

opengauss虽然继承自postgresql9.2&#xff0c;但由于做了魔改&#xff0c;网上通用的从oracle_fdw源码编译安装到postgresql的方法&#xff0c;是否成功的应用到opengauss&#xff0c;并不一定&#xff0c;今天试了一下&#xff0c;参照opengauss官网文档&#xff08;其实写的…

Spring Bean的作用域及生命周期

目录 前言&#xff1a; Bean的作用域&#xff08;Scope&#xff09; 单例模式 原型模式&#xff08;多例作用域&#xff09; 请求作用域&#xff08;request&#xff09; 会话作用域 全局作用域 网络长连接 Spring执行流程 Bean的生命周期 测试 小结&#xff1a; 前…

多模态论文串讲:ALBEF VLMo BLIP CoCa Beit V3

文章目录 前言ALBEF:Align before Fuse: Vision and Language Representation Learning with Momentum Distillation(2021-10)VLMO: Unified Vision-Language Pre-Training with Mixture-of-Modality-Experts(2021-11)relatedmethod BLIP&#xff1a;Bootstrapping Language-Im…

【贴片SD Card介绍】贴片SD Card (LEILONG雷龙科技)

有幸申请到了雷龙科技代理的 贴片 SD Card (SD NAND) 样品&#xff0c;做出测试&#xff0c;分享一下。 型号&#xff1a;CSNP32GCR01-BOW&#xff1b;CSNP4GCR01-BOW 生产方&#xff1a;CS创世半导体 由于是第一次使用贴片类型的 SD Card &#xff0c;可能文章会有较多疏忽。…

【Git】Windows Git和TortoiseGit安装教程(Git2.23.0、TortoiseGit2.8.0、语言包2.8.0)

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…