vlambda博客
学习文章列表

动态规划之求路径最短

动态规划是数据结构中第二章的内容,因此动态规划是一个比较重要的知识。





想要求最短路径,我们当然把 每一条路径都去尝试一遍,把每次的路径总和都记录下来,最后比较大小,得出路径最小和(这是枚举法)。


假如 数据 很多,这样运行时间会很慢。因此,在这里可以运用动态规划来求解。

动态规划:假如从顶点开始,我们知道第二层的最短路径是什么,那么也就知道了最短总路程的和;假如我们知道了第三层的 最短总路程的和 ,我们也就知道了 们知道第二层的最短路径是什么 ······以此类推,所以我们先从倒数第二层开始着手,求出倒数第二层 每一个路径的 ,求出后,循环到倒数第三层,利用上面所求,同样求出倒数第三层 每一个路径的 ...以此循环,得到顺数第二层的每一个路径的,也同时得出了题目的解。






把图转换为上图,观察得知,可以用一个二维数组来实现此图



以下求 最大路径和是源代码:

#include<stdio.h>

int flag=1;

int max(int* a,int* b){

if(*a>=*b){

flag=1;

return *a;

}

else {

flag=0;

return *b;

}

}

int main()

{

int a[][4]={{2},{5,100},{100,0,65},{50,60,20,0}};


int s[][4]={{},{},{},{50,60,20,0}}; //用来记录每一个路径的最大路径和 


int i=0,j,cow=4,row=4;

while(i<=3){

s[row-1][i]=a[row-1][i];

i++;

}

for(i=row-2;i>=0;i--){

for(j=0;j<=i;j++){

s[i][j]=max(*(s+i+1)+j,*(s+i+1)+j+1)+a[i][j];

}

}

printf("%d\n",s[0][0]);

}