动态规划
2016-06-30 17:33
204 查看
机考前一天抱抱佛脚吧,之前学过一些,现在整理一下概念。
强烈安利:动态规划:从新手到专家
以最短路径Dijkstra算法为例说明。先贴代码(参考大话数据结构):
状态:用来描述该问题的子问题的解。一般只与前面出现的状态有关,与后面出现的状态无关。此处a(i)即是我们要找的状态(这里a(i)指的是第i个阶段下d[i]的整体情况)。i表示状态的阶段,由于要求v0到其他n-1个点的路径,因此有n-1种状态(每一阶段不一定都会更新,但是若每个阶段都会更新,则至多更新n-1次,这是因为每一阶段必会至少求出到一个顶点的最短路径)。j表示每一阶段状态中,对应不同顶点的情况。
状态转移方程:由i-1状态转换到i状态的方程,一般根据题目情况可以推导出来。在求最短路径时,若要求v0到vi点的最短路径,就需要知道与v0到与vi相连的其他点的最短路径,并求得这些点与vi之间的最短路径,若两者之和小于在i-1状态下的最短路径,则进行更新。
故状态转移方程可以表示为:di[j]=min{mini+arc[k][j],di−1[j]}
动态规划,最重要的问题就是分析出状态,以及状态转移方程。
强烈安利:动态规划:从新手到专家
以最短路径Dijkstra算法为例说明。先贴代码(参考大话数据结构):
#define MAXVEX 100 #define INFINITY 100000000 typedef int Path[MAXVEX]; //存储最短路径下标 typedef int Cost[MAXVEX]; //存储到各点的最短路径 void ShortestPath_Dijkstra(MGraph G, int v0, Path p[], Cost d[]) { int i,j,k,min; int final[MAXVEX]; //final[i]=1表示已求得从v0至vi最短路径 /*初始化数据*/ for(i=0;i<G.numVertexes;i++) { final[i]=0; d[i]=G.arc[v0][i]; //arc数组中存储两顶点间距离信息 p[i]=0; } d[v0]=0; //v0至v0距离为1 final[v0]=1; //v0至v0不需要求路径 /*状态求解*/ for(i=1;i<G.numVertexes;i++) { min=INFINITY; for(j=0;j<G.numVertexes;j++) { if(!final[j] && d[j]<min) //寻找离v0最近的顶点 { k=j; min=d[j]; } } final[k]=1; //目前已找到的最近顶点置1 for(j=0;j<G.numVertexes;j++) { if(!final[j] && (min+G.arc[k][j])<d[j]) { d[j]=min+G.arc[k][j]; p[j]=k; } } } }
状态:用来描述该问题的子问题的解。一般只与前面出现的状态有关,与后面出现的状态无关。此处a(i)即是我们要找的状态(这里a(i)指的是第i个阶段下d[i]的整体情况)。i表示状态的阶段,由于要求v0到其他n-1个点的路径,因此有n-1种状态(每一阶段不一定都会更新,但是若每个阶段都会更新,则至多更新n-1次,这是因为每一阶段必会至少求出到一个顶点的最短路径)。j表示每一阶段状态中,对应不同顶点的情况。
状态转移方程:由i-1状态转换到i状态的方程,一般根据题目情况可以推导出来。在求最短路径时,若要求v0到vi点的最短路径,就需要知道与v0到与vi相连的其他点的最短路径,并求得这些点与vi之间的最短路径,若两者之和小于在i-1状态下的最短路径,则进行更新。
故状态转移方程可以表示为:di[j]=min{mini+arc[k][j],di−1[j]}
动态规划,最重要的问题就是分析出状态,以及状态转移方程。
相关文章推荐
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- C#使用动态规划解决0-1背包问题实例分析
- 动态规划
- C++ 动态规划
- 动态规划解决背包问题的核心思路
- DP(动态规划) 解游轮费用问题
- 动态规划的用法——01背包问题
- 动态规划的用法——01背包问题
- 《收集苹果》 动态规划入门
- 《DNA比对》蓝桥杯复赛试题
- 《背包问题》 动态规划
- 自顶向下动态规划解决最长公共子序列(LCS)问题
- 01背包问题
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 关于爬楼梯的动态规划算法
- 动态规划 --- hdu 1003 **
- DP问题各种模型的状态转移方程
- 0-1背包解题过程
- 背包问题