3、动态规划问题中的最优路径保存与输出

在动态规划问题中,我们经常会遇到以下问题,最优解倒是求出来了,但是最优解的路径呢?如何输出?这确实是一个问题,而且往往比较难哟。。

我这里说的路径是指,像在钢条切割问题中,从哪些地方切可以达到最优化,在矩阵链乘问题中,从哪些地方进行组合可以使效率最高?

在钢条切割问题中:

  1. for(j=1;j<=i; j++){
  2. if(priceStore[i-j]+ironPrice[j-1]>price){
  3. pathStore[i]=j; //意思为使是长度为i的钢条价格达到最优,需要从第j个位置进行截断,当然
  4. //可能还有其它的位置呢。
  5. }
  1. while(n>0){
  2. std::cout<<pathStore[n]<<std::endl;
  3. n=n-pathStore[n];
  4. }
  5. 在以上问题中,由于我们只要记住切割点就可以了,因为钢条的价格只与它的长度有关,与位置无关,因此可以说是一个一维的问题。 于是只要用一个一维的数组记录
  6. 就可以了,也就是用数组的下标表示为钢条的长度,而该位置数组的值表示为切割的位置 ,如下
  1. pathStore[i]=j表示对于长度为i的钢条的它的最优解是从位置j进行切割。
  1. 其实我们要明白一点,那就是我们的每次迭代都只产生一次切割。
  2. for(int i=1;i<=Length; i++){ price=Max((ironPrice[i]+ironCutPrb(ironPrice,Length-i-1)),price); } 在上面的程序中,其实如果在“归”到最后的时候,上面只产生了一次切割,也就是从i=1到i<=Length,我们只切割一次。只需记录一次就可以了。 然后每次子问题的迭代都会记录一次这些问题。 while(n>0){ std::cout<<pathStore[n]<<std::endl; n=n-pathStore[n]; } 这个就是输出代码啰。。你看,首们我们n被初使化成了Length,实参。于是第一次会打印当长度为Length时的切割位置,也就是从哪里切割。然后进入到子问 题所记录的切割点。这里我人还剩下多少呢?n-pathStore[n],这就是我们的第一个子问题所要处理的长度,于是有人问,难道pathStore[n]就不需要处理了吗? 其实我们的代码是这么写的,在主代码中, for(int i=1;i<=Length; i++){ price=Max((ironPrice[i]+ironCutPrb(ironPrice,Length-i-1)),price); } 我们是固定左边,也就是左边不切割,只切割右边。当然我们也就只记录右边的点啰。

    在矩阵链乘法的问题中,

       if(multiCount>(multiplay_iterator(multiDem,start,i)+multiplay_iterator(multiDem,i+1,end)+multiDem[start-1]*multiDem[i]*multiDem[end])){ storePath[start][end]=i; multiCount=multiplay_iterator(multiDem,start,i)+multiplay_iterator(multiDem,i+1,end)+multiDem[start-1]*multiDem[i]*multiDem[end]; } void printMultiPath(int start,int end){ if(start==end) return ; if(storePath[start][end]==start||storePath[start][end]==end) return; std::cout<<"A"<<start<<" * "<<"A"<<storePath[start][end]<<std::endl; std::cout<<"A"<<storePath[start][end]+1<<" * "<<"A"<<end<<std::endl; printMultiPath(start,storePath[start][end]); printMultiPath(storePath[start][end]+1,end); } 我们有处理这个问题用了一个二维数组,因为这种情况和位置有关呢,其行和列分别表示start和end。 int storePath[20][20]={0}; 不同于钢条只与长度有关。而且输出该组合也用了递归的思想。原问题->子问题->子子问题->.....->子....子问题。。。 printMultiPath(start,storePath[start][end]); printMultiPath(storePath[start][end]+1,end);

来自为知笔记(Wiz)

时间: 2025-01-17 11:00:09

3、动态规划问题中的最优路径保存与输出的相关文章

最优路径问题

package 数阵中的最优路径; import java.util.Scanner; public class Main { /** * 数值三角形中的最大路径 * 随机产生一个n行的点数值三角形(第k行有k个点,每个点都带有一个正整数,)寻找从顶点开始每一步可沿着左或者右向下的至底部的一条路径, * 使得该路径的和最大. * * 数值三角形中的最大路径的搜索 * 应用动态规划,采用逆推法从低向上逐行反推 * 随机产生的点数值三角形存储在一个二维数组中,同时赋值给b(n,n),这里的数组b(i

蚁群算法求解迷宫最优路径问题

本段程序的基本思想是利用蚁群算法中的蚁周模型,来对全局的迷宫图进行信息素的跟新 和为每一只蚂蚁选择下一个方格. 一共会进行RcMax = 2000轮模拟(理论上模拟的次数越多结果 会越接近真实值),而在每一轮中会排除 M = 10只蚂蚁进行探路.同时在算法的回溯思想上采用的 是栈的数据结构来实现的.当栈最终为空时则表示无解.但同时这段程序的一缺点就是:由于我没在 算法中对每一轮的每只探路蚂蚁采用多线程的模式,所以整体的运行效率还不是很高.如读者有好的 思想或建议,请留言. #include<io

Matlab实现Flyod求最短距离及存储最优路径

Matlab实现Flyod求最短距离及存储最优路径 一.实际数据 已知图中所有节点的X.Y坐标. J01-J62:1-62; F01-F60:63-122; Z01-Z06:123-128; D01-D02:129-130. 二.Floyd求所有节点间的最小距离及通过矩阵存储最优路径的节点 1 function [ optimal,path,maxnum ] = Floyd( distance,liantong,num,p,q ) 2 %Author:ljy 3 %Date:20170919 4

路网最优路径算法之一分层搜索

1 背景 前面介绍了关于双向及启发式的搜索,它们均可以实现了效率的倍增.但是应用到长距离(例如武汉——杭州大于500公里)的搜索时,平均效率存在100ms级甚至s级的耗时,显然这样一个面对广大用户群的互联网服务引擎效率是不可接受的,那么有没有优化的方向可以实现数量级的提升?      但人类对效率与正确的极致追求也是不止境的.关于双向及启发式搜索,它们的优化初衷均是一致的:缩短搜索范围.有人想到另一个路网搜索优化的方向:稀疏搜索路网密度——分层算法. 2 分层算法 假设有个长距离路径搜索的cas

leetcode(329)矩阵中的最大递增路径

矩阵中的最大递增路径 解题思路:动态规划 class Solution { public int longestIncreasingPath(int[][] matrix) { if(matrix.length==0||matrix[0].length==0){ return 0; } int xlen = matrix.length; int ylen = matrix[0].length; int[][][] flags = new int[xlen][ylen][2]; for(int i

从算法入手讲解如何在SQL Server中实现最优最简

算法是计算机科学中一个重要的研究方向,是解决复杂问题的关键.在计算机世界中,算法无处不在.数据库是存储数据和执行大批量计算的场所,在数据库中使用一些简单的SQL命令,进行存储.查询.统计.以解决现实世界中的问题已经是屡见不鲜.随着数据量的大幅度增加和业务规则的日益复杂,越来越需要一种专门的方法来满足效率和准确性方面的要求.如何把解决问题的复杂算法转换为数据库能够执行的命令,也是数据库应用技术研究的一个方面.本文以MSSQL中的命令来阐述例子. 数据库中可以存储实体的数据集合,在进行运算时,数据库

struts2中如何根据请求路径定位到详细的访问action

在struts2中在访问一个菜单链接时,我们只需要将相应的package 命名空间和 action的name进行组合,并加上相应的后缀,就可以直接访问到相应的Action了,那么这个过程是如何进行的,多个相同命名空间的 package是如何满足互不冲突的呢,这就需要详细了解struts2中是如何解析路径信息,并根据访问路径寻找相应的action配置了. 整个过程我们可以分成以下几个步骤进行处理 解析xml,将所有可以访问到的路径信息进行保存 根据访问请求信息,取其中可用的路径 根据路径进行查找,

C#中winform使用相对路径读取文件的方法

这篇文章主要介绍了C#中winform使用相对路径读取文件的方法,实例分析了C#使用相对路径读取文件的技巧与实际应用,需要的朋友可以参考下 本文实例讲述了C#中winform使用相对路径读取文件的方法.分享给大家供大家参考.具体分析如下: 目录结构如下图所示:   方法一:由于生成的exe文件在bin\debug目录下,可以使用向上查找目录的方式获取要读取的xml文件 复制代码代码如下: string haarXmlPath = @"../../haarcascade_frontalface_a

java中如何创建带路径的文件

请教各位大侠了,java中如何创建带路径的文件,说明下 这个路径不存在 ------回答--------- ------其他回答(2分)--------- Java code File f = new File("c:/1.txt"); if(!f.exists()){ try { f.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } ------其他回答(18分)--------- Java cod