动态规划
来源:互联网 发布:西安广电网络招聘 编辑:程序博客网 时间:2024/06/01 10:43
机考前一天抱抱佛脚吧,之前学过一些,现在整理一下概念。
强烈安利:动态规划:从新手到专家
以最短路径Dijkstra算法为例说明。先贴代码(参考大话数据结构):
#define MAXVEX 100#define INFINITY 100000000typedef 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]}
- 故状态转移方程可以表示为:
动态规划,最重要的问题就是分析出状态,以及状态转移方程。
0 0
- 动态规划!!!动态规划!!!
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 欢迎使用CSDN-markdown编辑器
- 第一次写博客前的准备(2016-6-30号)
- C#图片压缩处理
- 手机端如何维持登录状态
- 5.3、Android Studio录像
- 动态规划
- TimePicker+DatePicker
- spark机器学习笔记:(五)用Spark Python构建分类模型(下)
- Spring Aop配置时的切入点表达式
- Oracle:跳跃式索引(Skip Scan Index)浅析
- JAX-RS入门 八: HTTP响应
- APP开发接口分类介绍
- Java中避免空指针的几个方法
- 转屏