动态规划求解多段图问题(非递归)

  • 问题描述
  • 求解思路
    • 动态规划逆序解法
      • 逆序实现代码
    • 动态规划逆序解法
      • 顺序实现代码

问题描述

如图所示,在A处有一水库,现需要从A点铺设一条管道到E点,边上的数字表示与其相连的两个地点之间所需修建的管道长度用c数组表示, 例如c(A,B1)=2。现要找出一条从A到E的修建线路,使得所需修建的管道长度最短。

求解思路

对于有k个阶段的动态规划问题,从第k阶段到第1阶段的求解过程称为逆序解法,从第1阶段到第k阶段的求解过程称为顺序解法。

动态规划逆序解法

给出图的状态转移方程f(s)的递推顺序是从后向前,即E-→A,对应逆序解法。

用next表示路径.上一个顶点的后继顶点,其求解A到E最短路径的过程如下

逆序实现代码

#include <iostream>
#include <cstring>
using namespace std;
#define INF 0x3f3f3f3f
#define MAX 21
int n=10;
int c[MAX][MAX];
int pre[MAX];
int dp[MAX];void Init(){    memset(c,0,sizeof(c));memset(dp,0,sizeof(dp));memset(pre,0,sizeof(pre));for(int j=0;j<n;j++){c[j][j]=0;}c[0][1]=2;c[0][2]=4;c[0][3]=3;c[1][4]=7;c[1][5]=4;c[2][4]=3;c[2][5]=2;c[2][6]=4;c[3][4]=6;c[3][5]=2;c[3][6]=5;c[4][7]=3;c[4][8]=4;c[5][7]=6;c[5][8]=3;c[6][7]=3;c[6][8]=3;c[7][9]=3;c[8][9]=4;
} int main() {Init();for(int i=n-2;i>=0;i--){dp[i]=INF;for(int j=i;j<n;j++){if(c[i][j]!=0){if(c[i][j]+dp[j]<dp[i]){                    pre[i]=j;dp[i]=c[i][j]+dp[j];                    } }}}cout<<dp[0]<<endl;cout<<"最短路径为"<<endl;int i=0;cout<<"0-->";while(true){cout<<pre[i];i=pre[i];if(i==9)break;cout<<"-->"; }return 0;
}

动态规划逆序解法

对于图8. 4,顺序解法是从源点出发,求出到达当前状态的最短路径,再考虑下一个阶段,直到终点E。对应的状态转移方程如下:

pre 表示路径,上一个顶点的前驱顶点,其求解 A到E最短路径的过程 如下。

顺序实现代码

#include <iostream>
#include <cstring>
using namespace std;
#define INF 0x3f3f3f3fint main() {int n=10,k=1,j=1;int c[n][n];int pre[n];int dp[n];memset(c,0,sizeof(c));memset(dp,0,sizeof(dp));memset(pre,0,sizeof(pre));int cost=0;dp[0]=0;c[0][1]=2;c[0][2]=4;c[0][3]=3;c[1][4]=7;c[1][5]=4;c[2][4]=3;c[2][5]=2;c[2][6]=4;c[3][4]=6;c[3][5]=2;c[3][6]=5;c[4][7]=3;c[4][8]=4;c[5][7]=6;c[5][8]=3;c[6][7]=3;c[6][8]=3;c[7][9]=3;c[8][9]=4;   for(k=1;k<n;k++){//先算和0连着的3个点,不用比大小,所以可以先算 if(c[0][k]!=0){dp[k]=dp[0]+c[0][k];}else{break;}}int mini;//记录最小点的序号 for(j=k;j<n;j++){int mincost=INF;//记录最短距离 for(int i=1;i<n;i++){if(c[i][j]!=0){cost=dp[i]+c[i][j];//计算每两个链接点的距离 if(mincost>cost){//替换最小距离 mincost=cost;mini=i;}}}dp[j]=mincost;//记录到节点j的最小距离 pre[j]=mini;//记录到节点j最近的点 }cout<<dp[9]<<endl;int i=9;cout<<"9<--";while(true){     cout<<pre[i];i=pre[i];if(i==0)break;cout<<"<--"; }return 0;
}

动态规划求解多段图问题相关推荐

  1. 动态规划求解多段图最短路径

    动态规划求解多段图最短路径 题目: 分析见源代码注释 源代码: #include<stdio.h> #define N 10//定义定点数,编号从1开始 #define M 5//定义层数 ...

  2. 在c语言中nextarc是什么意思,c语言求解多段图〔向前处理法〕.docx

    c语言求解多段图[向前处理法] #include#include#define Infinity 1000 //无穷大#define Max 45#define null 0 typedef stru ...

  3. 动态规划多段图和货郎担问题

    一.实验目的 1.掌握能用动态规划方法求解的问题应满足的条件: 2.加深对动态规划方法的理解与应用: 3.锻炼学生对程序跟踪调试能力: 4.通过本次实验的练习培养学生应用所学知识解决实际问题的能力. ...

  4. 动态规划——多段图问题

    多段图问题 多段图问题是利用动态规划思想解决的经典问题之一,在日常生活中应用广泛. 问题描述 若存在一个有向加权图G,且G能分出起点和终点以及中间的n的阶段,求起点到终点的最短(长)距离. 分析设计 ...

  5. 动态规划中的多段图问题

    多段图的最短路径问题:只有相邻的节点之间有联系 多段图的定义: 1.多段图是一个有向.无环.带权 图. 2.有且仅有一个起始结点(原点source) 和 一个终止结点(汇点target). 3.它有n ...

  6. 多段图的动态规划算法(C/C++)

    1. 实验环境 (1)Visual Studio 2019(32位调试器) (2)Windows 10 2. 多段图描述 多段图G = (V,E)是一个带权有向图,它具有以下特性: 图中的节点被划分成 ...

  7. 算法-动态规划2图问题-多段图的最短路径问题

    算法-动态规划2-多段图的最短路径问题 多段图的最短路径问题 问题:设图G=(V,E)是一个带权有向图,如果把顶点集合V划分成k个互不相交的子集Vi(2<=k<=n,1<=i< ...

  8. 1008-----算法笔记----------0-1背包问题(动态规划求解)

    1.问题描述 给定n种物品和一个背包,物品i的重量是wi,其价值为vi,背包的容量为C.问:应该如何选择装入背包的物品,使得装入背包中物品的总价值最大? 2.问题分析 上述问题可以抽象为一个整数规划问 ...

  9. 数据结构和算法——用动态规划求解最短路径问题

    一.动态规划求解问题的思路     在<算法导论>上,动态规划的求解过程主要分为如下的四步: 描述最优解的结构 递归定义最优解的值 按自底向上的方式计算最优解的值 由计算出的结果构造一个最 ...

最新文章

  1. python 写入网络视频文件很慢_用Python将数据写入LMDB非常慢
  2. 【Linux网络编程】原始套接字实例:发送 UDP 数据包
  3. c++调用cplex求解例子_递归算法的R语言实现 (罗汉塔、九连环、斐波那契数列等问题的求解)...
  4. php Trait 基础应用讲解
  5. mozilla js 引擎_Mozilla的内容拦截器,新JavaScript引擎以及更多开源新闻
  6. python怎么和数据库连接_Java和Python都怎么连接数据库
  7. DeepWalk: Online Learning of Social Representations-1
  8. 深度学习笔记--激活函数:sigmoid,maxout
  9. 添加.MSPX文件(VISTA下)
  10. C++ 迭代器是指针吗
  11. C# 将Word,Execl,PPT,Project, 文件转成PDF, 不依赖Office!!
  12. 三菱PLC编程口通信上位机端报文和java示范代码
  13. 温度采集系统(开源 原理图、PCB文件+源码+云平台+app端设计方案)
  14. c语言递归打印99乘法表,递归与循环转换_九九乘法表打印_算法
  15. 深度讲解如何发挥出文章title标题的作用
  16. Excel必知必会——count,counta,countif,countifs
  17. PTA 7-4(随手写的,不适合网站提交)
  18. 测试开发工作者日记:2020.6.28
  19. win11展开右键菜单(还原为win10状态)的方法
  20. python日志级别

热门文章

  1. 5.1 规定“学什么”的培养方案——《逆袭大学》连载
  2. 目前计算机技术已经得到了全面的发展,计算机网络技术对人的全面发展的影响.doc...
  3. oracle9i新建数据库的用户有哪些,oracle9i新建数据库
  4. 苹果审核Guideline 1.4.1 - Safety - Physical Harm
  5. 产品原型设计教程:墨刀
  6. dell5580bios恢复出厂_戴尔笔记本电脑进入BIOS的方法及BIOS怎么恢复出厂设置?
  7. 问题 F: 小白鼠排队
  8. img图片加载失败时,展示默认图片的方法
  9. python中函数的定义以及如何编写一个函数
  10. mysql如何降级_降级MySQL(参考MySQL官方文档)