最短路径Floyd与区间DP

news/2024/4/27 11:25:51/文章来源:https://blog.csdn.net/m0_62102955/article/details/130325959

floyd算法是求最短路径的算法,算法复杂度为n(o^3),其优点在于能够一次求解所有点到其他点的最短路径,不需要其他运算,使用二维数组存储。其三层循环自外向内分别为:中间点,起始点和终点。状态方程为:

num[i][j]=min(num[i][j],num[i][k]+num[k][j]);

num[j][i]=num[i][j];                /*在num[i][j]发生变化时num[j][i]要同时改变,如果不是图而是网的话不需要改变*/

注:num初值设定为点与点的邻接矩阵。

代码:

#include<bits/stdc++.h>
using namespace std;
int num[105][105];
int main(){int n=5,m=6;        /*点数和边数,可以随意设置,下附该代码的测试样例*/for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){num[i][j]=0x3f3f3f3f;}}for(int i=1;i<=n;i++)num[i][i]=0;        /*自己到自己一定是0*/for(int i=1;i<=m;i++){int x,y,l;cin>>x>>y>>l;num[x][y]=l;num[y][x]=l;}for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){num[i][j]=min(num[i][j],num[i][k]+num[k][j]);num[j][i]=num[i][j];}}}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(num[i][j]==0x3f3f3f3f)cout<<"-1"<<" ";else cout<<num[i][j]<<" ";}cout<<endl;}system("pause");return 0;
}
/*
1 5 3
1 2 5
2 3 1
5 3 4
3 4 2
4 5 7
*/

注:点和点在初始状态下未邻接(不连通)时,应给一个极大值,一般用1e9或0x3f3f3f3f,不建议使用0或者负数,因为这样需要在进行状态转移增加判断,而如果设置成一个极大值可以直接用algorithm头文件里的min函数直接进行赋值。

区间DP是动态规划的一种,又称为合并类动态规划,是线性动态规划的扩展,它在分阶段地划分问题时,与阶段中元素出现的顺序和由前一阶段的区间中哪些元素合并而来有很大的关系。时间复杂度也为n(o^3),其三层循环分别为:步长,起始点,终点。而步长的作用是用来挑选起始点和终点之间的任意一点,这方面和Floyd有点像,但是区别是这个中间点服从   i<k<j。而Floyd可以是任何一点。

 

 

其状态转移方程为:

 dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+num[j]-num[i-1]);

注:num是每个点的权值的前缀和数组,dp是点与点合并的值

代码:

#include<bits/stdc++.h>
#define maxsize 305
using namespace std;
int dp[maxsize][maxsize];
int num[maxsize]={0};
int main(){int n;cin>>n;memset(dp,0x3f3f3f3f,sizeof(dp));for(int i=1;i<=n;i++){cin>>num[i];num[i]+=num[i-1];dp[i][i]=0;}for(int d=1;d<n;d++){for(int i=1;i<=n-d;i++){int j=i+d;for(int k=i;k<j;k++){dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+num[j]-num[i-1]);}}}cout<<dp[1][n];system("pause");return 0;
}

总结:

floyd和区间dp并不完全一致,本人在做题的时候因为用了区间dp的状态转移方程踩了这个坑。另外两者存储方式上floyd可以直接在邻接矩阵上操作,而区间dp是先走一维,再走二维,操作上也并不完全一致。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM原理

JVM 什么是JVM&#xff1f; JVM是一种虚拟出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 JVM有自己完善的硬件架构&#xff0c;如处理器、堆栈、寄存器等&#xff0c;还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。 使用J…

智慧管廊监控与报警管控一体化系统解决方案

摘要&#xff1a;智慧管廊监控与报警管控是一项综合性质较高的管控操作系统。在各项系统结构之间因为技术管理体系之间的差异&#xff0c;所评价的标准也有着不同的区分&#xff0c;导致各项标准之间难以实现相互之间的联通。这种形式下就需要实现环境与设备之间的监控管理、通…

(IPC)进程间通信的常用的两种方式——管道、共享内存

前言&#xff1a; 众所周知&#xff0c;不同的进程之间&#xff0c;在正常情况下&#xff0c;由于其拥有独立的PCB、上下文等原因&#xff0c;每个进程都是独立且互不干扰&#xff0c;这不仅保证了进程的安全&#xff0c;也降低了OS对于进程的管理成本。 但是通常情况下&…

01-yolo算法

要点&#xff1a; 归纳 YOLOv5 github 1 YOLO v1 1) 将一幅图像分成SxS个网格(grid cell)&#xff0c;如果某个object的中心 落在这个网格中&#xff0c;则这个网格就负责预测这个object。 2)每个网格要预测B个bounding box&#xff0c;每个bounding box 除了要预测位置之…

倾斜摄影三维模型、激光点云、正射影像、数字高程模型如何实现在线浏览?

四维轻云是成都远石技术团队基于浏览器打造的一款地理空间数据管理云平台&#xff0c;可实现TB级大规模倾斜摄影三维模型发布管理&#xff0c;并支持私有化部署和高阶功能定制化开发。 1、注册登录 首先在四维轻云官网点击「立即试用」按钮&#xff0c;进入登录页面并点击「注…

C# 特性(Attribute)

一、特性&#xff08;Attribute&#xff09;定义 特性&#xff08;Attribute&#xff09;是用于在运行时传递程序中各种元素&#xff08;比如类、方法、结构、枚举、组件等&#xff09;的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。 特性使用中括号…

2023年制造业产品经理考NPDP有什么用?

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…

键盘录入及标识符

键盘录入 键盘录入介绍&#xff1a; ●为什么要有键盘录入? 目的&#xff1a;为了让我们操作的数据,变得更加灵活 举例&#xff1a;int a10; 这里a虽然是个变量&#xff0c;但记录的值&#xff0c;却是手动写死的。 提问&#xff1a;能不能让a变量记录的值&#xff0c;灵活…

electron编译环境搭建和第一个桌面应用例子

前言 Electron是基于Chromium和Node.js实现的&#xff0c;所以开发人员所需要使用到的前端技术主要包括以下方面&#xff1a; 1、Html、CSS、JavaScript、ES6 2、前端开发工具Vue、Angular、React等的一种 3、其他网络、缓存、通讯、系统、跟踪等前端技术 4、对Vscode编辑…

JUC高级十二-ReentrantLock、ReentrantReadWriteLock、StampedLock

无锁→独占锁→读写锁→邮戳锁 1. 关于锁的大厂面试题 你知道Java里面有哪些锁?你说你用过读写锁&#xff0c;锁饥饿问题是什么&#xff1f;有没有比读写锁更快的锁&#xff1f;StampedLock知道吗?(邮戳锁/票据锁)ReentrantReadWriteLock有锁降级机制策略你知道吗&#xff1…

总结827

学习目标&#xff1a; 4月&#xff08;复习完高数18讲内容&#xff0c;背诵21篇短文&#xff0c;熟词僻义300词基础词&#xff09; 学习内容&#xff1a; 高等数学&#xff1a;刷1800&#xff0c;做了26道计算题&#xff0c;记录两道错题&#xff0c;搞懂了&#xff0c;但并不…

家庭智能开关通断—Homekit智能

智能通断器&#xff0c;也叫开关模块&#xff0c;可以非常方便地接入家中原有开关、插座、灯具、电器的线路中&#xff0c;通过手机App或者语音即可控制电路通断&#xff0c;轻松实现原有家居设备的智能化改造。 随着智能家居概念的普及&#xff0c;越来越多的人想将自己的家改…

HuggingFace入门教程--环境搭建

HuggingFace中文直译为”拥抱脸“&#xff0c;是最近非常火爆的一个人工智能社区&#xff0c;官网地址是&#xff1a;https://huggingface.co/ .关于HuggingFace的相关介绍大家可以自行百度。本文主要为刚入人工智能坑的小白指下路&#xff0c;同时也是逼着自己记录下学习过程中…

【ctfshow】命令执行->web29-web44

前言 半夜网抑云听歌听emo了 z 刷会儿题不然睡不着了呜呜呜 红中(hong_zh0) CSDN内容合伙人、2023年新星计划web安全方向导师、 华为MindSpore截至目前最年轻的优秀开发者、IK&N战队队长、 吉林师范大学网安大一的一名普通学生、搞网安论文拿了回大挑校二、 阿里云专家博…

线性链表 反转 -(递归与非递归算法)_20230420

线性链表 反转 -(递归与非递归算法)_20230420 前言 线性链表反转是非常有趣的算法&#xff0c;它可以采用多种方式实现&#xff0c;比较简洁的方法是递归反转&#xff1b;传统的方式是利用迭代反转&#xff0c;设定三个变量&#xff0c;采用类似滚动数组的方式&#xff0c;实…

qt中使用 ui 文件进行界面设计

目录 1、创建 Qt 应用 ​2、项目创建成功 3、直接点击打开 mainwindow.ui 文件 4、随便从左边侧边栏拖拽一个空间到 界面设计区域 5、在右侧边栏右键点击 pushButton 控件&#xff0c;点击转到槽 6、根据实际需要选择对应的信号&#xff0c;我这里方便演示选择 clicked&a…

SpringCloud --- Ribbon负载均衡

一、负载均衡原理 SpringCloud底层其实是利用了一个名为Ribbon的组件&#xff0c;来实现负载均衡功能的。 那么我们发出的请求明明是http://userservice/user/1&#xff0c;怎么变成了http://localhost:8081的呢&#xff1f; 二、源码跟踪 为什么我们只输入了service名称就…

【博学谷学习记录】超强总结,用心分享 | 架构师 MinIO学习总结

文章目录 MinIO对象存储的概念计算机数据存储系统-架构模式对象存储的优势常见的对象存储系统/服务&#xff08;Object Storage Service&#xff0c;OSS&#xff09; MinIO简介特点高级特性小结 MinIO部署基于 linux Binary 部署 MinIO ServerMinIO数据组织结构MinIO Client**基…

ISO-27145故障诊断说明

ISO-27145故障诊断说明 2.1 27145目录说明 ISO27145-1: 这里边介绍的是一般信息和用例定义&#xff1b; ISO27145-2: 这里边介绍的是与排放相关的通用数据规则&#xff0c;用于查询&#xff1b; ISO27145-3: 这里边主要介绍了支持的服务 12服务 14服务 19服务 22服务 31服务&…

「C/C++」C/C++强制类型转换

博客主页&#xff1a;何曾参静谧的博客 文章专栏&#xff1a;「C/C」C/C学习 目录 相关术语C语言中的强制类型转换C中的强制类型转换static_castdynamic_castreinterpret_castconst_cast 注意事项 相关术语 强制类型转换&#xff1a;是指将一个数据类型强制转换为另一个数据类型…