动态规划算法

Posted goldenellipsis

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划算法相关的知识,希望对你有一定的参考价值。

一、斐波那契数列(递推思想,动态规划算法)

二、多源最短路径(给定带权有向图(G = (V,E)),求任意两顶点(Vi,Vj)之间的最短路径)

  弗洛伊德算法(Floyd),动态规划思想,算法复杂度大O(N的三次方)。

  算法步骤:

  1、先定义一个n阶的矩阵,令其对角线的值为0,若存在弧,则对应元素为弧值,否则为无穷大

  2、逐步在原直接路径中增加中间顶点,若加入中间顶点后,路径变短,则修改之,否则维持

  3、所有顶点试探完毕,算法结束。

 1 #include <stdio.h>
 2 #define N 4
 3 #define MAXINT 1000
 4 int main()
 5 {    
 6     //#ifndef N
 7     int i,j,k;
 8     /* 
 9        1.A数组, 存储顶点之间弧值,对角线值为0,
10        顶点之间存在弧,存弧值,否则弧值MAXINT       
11     */
12     int A[N][N] = {   0,      5,      MAXINT,  7,
13                       MAXINT, 0,      4,       2,
14                       3,      3,      0,       2,
15                       MAXINT, MAXINT, 1,       0    
16                   };
17                   
18     /* 2.D数组Path数组赋值 */               
19     int D[N][N];    //Vi到Vj的最短路径长度
20     int Path[N][N]; //Vi到Vj的最短路径
21 
22     for(i=0; i<N; ++i)
23     {
24         for(j=0; j<N; ++j)
25         {
26             /* D数组赋值 */
27             D[i][j] = A[i][j]; 
28             /* Path数组赋值 */
29             if(i!=j && A[i][j] < MAXINT) 
30                 Path[i][j] = i;
31             else 
32                 Path[i][j] = -1;
33         }
34     }
35     
36     /* 3.计算最短路径长度及最短路径 */    
37     //加入k顶点的最短路径长度
38     //D[i][j] = min(D[i][j], D[i][k] + D[k][j]);
39     for(k=0; k<N; k++)
40     {
41         for(i=0; i<N; i++)
42         {
43             for(j=0; j<N; ++j)
44             {
45                 if(D[i][k]+D[k][j] < D[i][j]){
46                     D[i][j] = D[i][k] + D[k][j];
47                     Path[i][j] = Path[k][j];
48                 }
49             }
50         }
51     } 
52     //#endif
53     
54     /* 4.打印最短路径长度 */
55     for(i=0; i<N; ++i){
56         for(j=0; j<N; ++j)
57             printf("%5d",D[i][j]);
58         printf("
");
59     }
60     /* 
61         0  5  8  7
62         6  0  3  2
63         3  3  0  2
64         4  4  1  0
65     */
66     
67     /* 5.打印最短路径路径 */
68     for(i=0; i<N; ++i){
69         for(j=0; j<N; ++j)
70             printf("%5d",Path[i][j]);
71         printf("
");
72     }
73     /* 
74        -1  0  3  0
75         2 -1  3  1
76         2  2 -1  2
77         2  2  3 -1
78     */
79     return 0;
80 }

以上是关于动态规划算法的主要内容,如果未能解决你的问题,请参考以下文章

算法动态规划 ⑤ ( LeetCode 63.不同路径 II | 问题分析 | 动态规划算法设计 | 代码示例 )

Python之动态规划算法

算法动态规划 ① ( 动态规划简介 | 自底向上的动态规划示例 | 自顶向下的动态规划示例 )

算法动态规划 ① ( 动态规划简介 | 自底向上的动态规划示例 | 自顶向下的动态规划示例 )

代码随想录动态规划算法PDF

算法13---动态规划钢材裁剪