利用DP求解最短路径

可套用Assembly Lines问题解法

附上源代码JAVA版

 1 package second;
 2 public class SP {
 3     static int x=100000;//两点之间没路,路径长度设为无穷大
 4     static int max=100000;
 5     int data[][]=new int[10][10];//边的全值
 6     static int[]dist=new int[10];//记录最短路径的值
 7     static int path[]=new int[10];//记录最短路径
 8     public static void fpath(int a[][])//求最短路径的值
 9     {
10          int i,j,k;
11          dist[0]=0;
12          for(i=1;i<10;i++)
13          {
14              k=max;
15              for(j=0;j<i;j++)
16              {
17                  if(a[j][i]!=x)
18                      if((dist[j]+a[j][i])<k)
19                          k=dist[j]+a[j][i];    //dist[1]+a[1,4]=4+10=14
20              }                                 //dist[2]+a[2,4]=2+6=8 8<14 dist[4]=8 到节点4的最短路径
21              dist[i]=k;
22          }
23     }
24     static int froute(int a[][])//求最短路径
25      {
26          int j,b,k=1,i=9;
27          path[0]=10;
28          while(i>0)
29          {
30              for(j=i-1;j>=0;j--)
31              {
32                  if(a[j][i]!=x)
33                  {
34                      b=dist[i]-a[j][i];
35                     if(b==dist[j])
36                      {
37                          path[k++]=j+1;
38                          i=j;
39                          break;
40                      }
41                  }
42
43              }
44          }
45              return k;
46      }
47
48     public static void main(String[] args)
49     {
50         int i,m;
51         int[][] A ={
52                    {x,4,2,3,x,x,x,x,x,x},//A[j][i]表示点j到点i的代价
53                    {x,x,x,x,10,9,x,x,x,x},
54                    {x,x,x,x,6,7,10,x,x,x},
55                    {x,x,x,x,x,3,8,x,x,x},
56                    {x,x,x,x,x,x,x,4,8,x},
57                    {x,x,x,x,x,x,x,9,6,x},
58                    {x,x,x,x,x,x,x,5,4,x},
59                    {x,x,x,x,x,x,x,x,x,8},
60                    {x,x,x,x,x,x,x,x,x,4},
61                    {x,x,x,x,x,x,x,x,x,x},};
62         fpath(A);
63         System.out.print(dist[9]);
64         System.out.println("");
65         m=froute(A);
66         for(i=m-1;i>0;i--)
67             System.out.print(path[i]+"->");
68         System.out.print(path[0]);
69
70     }
71
72
73 }

问题

1.public static void main(String[] args)主函数格式改了直接就没法run;

2.给定义数组规定每行每列有多少int data[][]=new int[10][10];

3.静态数组定义方式:static int[]dist=new int[10];

4.NullPointerException数组长度未初始化;

参考:http://www.cnblogs.com/lpshou/archive/2012/04/17/2453370.html

时间: 2024-10-12 00:58:31

利用DP求解最短路径的相关文章

【141029】VC游戏编写中的求解最短路径算法源码

VC游戏编写中的求解最短路径算法源码,本示例是自动寻径演示,篮点是起点,红点是终点,按确定键开始.源码爱好者注:编译后运行的时候请把EXE文件从Debug目录中拷贝到项目根目录中,若不然会出错. 编著.程序设计:唐明理 程序顺序: 初始化队列.待处理节点入队列, 依靠对目的地估价距离插入排序,将离目的地估计最近的方案出队列,释放栈顶节点,释放申请过的所有节点,估价函数,估价 x,y 到目的地的距离,估计值必须保证比实际值小, 尝试下一步移动到 x,y 可行否,如果曾经有更好的方案移动到 (x,y

LeetCode OJ 322. Coin Change DP求解

题目链接:https://leetcode.com/problems/coin-change/ 322. Coin Change My Submissions Question Total Accepted: 15289 Total Submissions: 62250 Difficulty: Medium You are given coins of different denominations and a total amount of money amount. Write a func

利用栈求解迷宫问题

利用栈求解迷宫问题 源代码: #include<stdio.h> #include<stdlib.h> #define M 8 #define N 8 #define MaxSize M*N typedef struct { int i;//当前方块的行号 int j;//当前方块的列号 int di; //di是下一个可走的相邻方块的方位号 }Box; typedef struct { Box data[MaxSize]; int top;      //栈顶指针 }StType

dp求解各种子串子序列

目录 概念 最长上升子序列 最长连续子串 最长公共子序列 最长公共上升子序列 注:dp可能并不是求解该这些问题的最优算法,这里只是做一个dp 算法的简介. 概念 定义:假设现有一个 string = abcdefghijklmn 最长连续子串:要求在原序列中连续,比如 str = abcd.fghijklm都是valid substring 最长连续子序列:相对顺序在原序列中不变即可:比如 str = afgh.dfkn等等都是valid subsequence 说完了上面的定义:下面来说一说怎

python 实现dijkstra算法求解最短路径

? 重点:dijkstra算法按层计算其余点到源点的最短距离,层层扩展. 1. dijkstra算法 求解目标:找到图中源点到其余点的最短距离,是单源点最短距离算法. 整体思路:每一步都寻找到与源点最近的点,层层扩展,是贪心算法. 具体实现: 输入:给定一个图的邻接表M,源点u. 辅助变量:存储与源点最短距离的字典.存储已访问节点的集合. 算法过程: 初始化:将源点加入已访问集合 对已访问集合中每个点的所有邻接点,计算与源点的最短距离存入字典和已访问集合. 重复2,直至所有顶点被访问 2. 求解

437 - The Tower of Babylon(记录结果再利用DP)

最近准备进入动态规划的章节,仔细看了看紫书上对01背包的讲解,感觉很好..之前看<挑战程序设计竞赛>那本书,就没有讲的那么深刻 .      更加深刻的理解了什么叫记录结果再利用,手工操作了一遍01背包的过程,也有点明白它的状态是如何转移的了,而且那个状态方程所构成的递推关系真的很巧妙 . 言归正传..这道题就是嵌套矩形问题稍微改了一下,之前的嵌套矩形只需要维护一个状态量就行了,但是这道题是立方体,可以翻转的,所以还要维护一个特征量--高. 由于矩形的嵌套关系,每个状态只会出现一次,所以这么表

【翻译】利用加速度求解位置的算法——三轴传感器

摘要 此文档描述并使用MMA7260QT三轴加速计和低功耗的9S08QG8八位单片机实现求解位置的算法 . 在今天先进的电子市场,有不少增加了许多特性和智能的多功能的产品.定位和游戏只是得益于获取到的位置信息的一部分市场.一个获取这种信息的可选方案是通过使用惯性传感器.从这些传感器中取得的信号需要进行一些处理,因为在加速度和位置之间没有一种直接转换. 为了获得位置,需要对加速度进行二次积分.本文介绍一种简单的算法实现加速度的二重积分.为了获取加速度的二重积分,一个简单的积分要进行两次,因为这样也

利用分支限界法求解单源最短路(Dijkstra)问题

分支限界法定义:采用BFS算法,并使用剪枝函数的算法称为分支界限法. 分支限界法解释:按广度优先的原则,有选择的在其child中进行扩展,从而舍弃不含有最优解的分支,不断重复这一过程,直到找到答案或者判定无解. 分支界限法常常用到优先队列来选择最佳扩展节点,有时也会用到普通队列,以先进先出为原则来进行筛选. 单源最短路问题定义:给定有向图和起点,寻找到达所有点的最短路径. 单源最短路的分支限界法概述:首先把节点加入优先队列,之后不断地从队列中取出最优扩展点,观察其可抵达的所有目标节点,若当前路径

最大子序列乘积----DP求解

问题起源于<数据结构与算法分析-C语言描述>一书中的习题2.12. 存在序列A(a1,a2,......,an ),(在此仅讨论序列A中元素均为整数的情况) 问:给出有效的算法求解最大子序列乘积. 一看此题,容易想到的是穷举所有的可能的子序列,求乘积后去最大值,代码如下. 1 int MaxProduct(int a[], int len) 2 { 3 int Max = a[0]; 4 for(int i = 0; i < len; ++i) 5 { 6 int thisMax = 1