最短路径Floyd与区间DP

news/2024/11/15 4:02:49/

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.ppmy.cn/news/49023.html

相关文章

leetcode 879. Profitable Schemes(有利润的计划)

有几个工程&#xff0c;每个工程需要group[ i ]个人去做&#xff0c;做完了可以得到profit[ i ]的利润。 现有2个限制条件&#xff1a; 人数上限是n, 且参加了一个工程的人不能再参加其他工程。 利润下限minProfit, 至少要获得minProfit的利润。 问有多少种工程的选法&#xff…

C语言-字符串

sizeof和strlen 的区别&#xff1a; 区别1&#xff1a; 1.sizeof计算整个数组大小&#xff0c; 2.strlen 计算有效的数组大小 新建字符数组”hello“ char cdata[128]"hello"; printf("sizeof--cdata的长度&#xff1a;%d\n",sizeof(cdata)); pri…

shell编程入门 第一章 基本语法

shell编程的语法主要分为五个环节&#xff0c;分别是变量&#xff0c;字符串&#xff0c;运算符&#xff0c;流程控制&#xff0c;函数五大部分 shell编程的基础语法 一 变量1.1 shell变量名1.2 使用shell变量1.3只读变量1.4 删除变量 二 字符串2.1 定义时最好用双引号2.2获取字…

ANR分析

ANR分析流程 一、ANR基本知识 1.1、发生原因 一句话总结&#xff1a;没有在规定的时间内&#xff0c;干完要干的事情&#xff0c;就会发生ANR。 1.2、ANR分类 从发生的场景分类&#xff1a; Input事件超过5s没有被处理完 Service处理超时&#xff0c;前台20s&#xff…

那些突然想到的问题---EIP和PC的区别

我们都知道PC指针是指程序计数器&#xff08;Program Counter&#xff09;&#xff0c;也称为指令指针&#xff08;Instruction Pointer&#xff09;&#xff0c;是一种寄存器&#xff0c;用于存储计算机正在执行的指令的地址。在CPU执行程序时&#xff0c;PC指针会不断地更新&…

9.7 字符串的指针和指向字符串的指针变量

9.7 字符串的指针和指向字符串的指针变量 一.字符串表示形式二.字符串指针做函数参数1.数组名做函数参数2.数组指针做函数参数 三.字符指针变量与字符数组&#xff08;1&#xff09;字符数组是由若干个元素组成&#xff0c;每个元素中存放一个字符。&#xff08;2&#xff09;赋…

Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用

Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;在数据处理、科学计算、数学建模、数据挖掘和数据可视化方面具备优异的性能&#xff0c;这些优势使得Python在气象、海洋、地理、气候、水文和生态等地学领域的科研和工程项目中得到广泛应用。可以…

Activity启动模式总结

前言 相关文章其实很多了。通过对阅读调试相关源码后&#xff0c;我认为还是有必要按自己的理解梳理总结输出。 核心源码在com.android.server.wm.ActivityStarter#startActivityInner 启动方式详解 Standard 默认模式&#xff0c;会直接在打开的Task上创建。不管taskAffi…