动态规划

来源:互联网 发布:西安广电网络招聘 编辑:程序博客网 时间: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],di1[j]}

动态规划,最重要的问题就是分析出状态,以及状态转移方程。

0 0
原创粉丝点击