dp算法之有代价的最短路径

题目:有代价的最短路径

题目介绍:如下图所示,现在平面上有N个点,此时N=7,每个点可能和其他点相连,相连的线有一定权值,求出从0点到N-1点的消耗权值的最小值。

分析:用动态规划的思路来解决,每一点与其他点的消耗权值的最小值都储存在一个二维数组中,下一个点消耗的最小值可以根据前一个点来得出。如果两个点不相连,可以认为这两点的权值为无穷大。设一个二维数组初始化为无穷,再导入权值初始值,再用状态方程得出最小值储存在数组中。

状态方程:l[k][j] = min(l[k][j], l[k][i] + l[i][j])

我们可以得出0到N-1的最短路径表格:

距离0123456
00253136

代码:

 1 #include <iostream>
 2 using namespace std;
 3 int min(int a, int b);
 4 int main()
 5 {
 6     int X = 99999;
 7     int N = 7;
 8     int i, j, k;
 9     int **l = new int *[N];
10     for (i = 0; i<N; i++)
11     {
12         l[i] = new int[N];
13     }
14     for (i = 0; i < N; i++)
15     {
16         for (j = 0; j < N; j++)
17         {
18             l[i][j] = X;
19         }
20     }
21     l[0][1] = l[1][0] = 2;
22     l[1][2] = l[2][1] = 3;
23     l[2][6] = l[6][2] = 4;
24     l[0][3] = l[3][0] = 3;
25     l[3][6] = l[6][3] = 3;
26     l[0][4] = l[4][0] = 1;
27     l[4][5] = l[5][4] = 2;
28     l[5][6] = l[6][5] = 3;
29     for (k = 0; k < N; k++)
30     {
31         for (j = 0; j < N; j++)
32         {
33             for (i = 0; i < N; i++)
34             {
35                 l[k][j] = min(l[k][j], l[k][i] + l[i][j]);
36             }
37         }
38     }
39     for (i = 1; i < N; i++)
40     {
41         cout << l[0][i] << endl;
42     }
43 }
44 int min(int a, int b)
45 {
46     if (a > b)
47     {
48         return b;
49     }
50     else { return a; }
51 }

结果:

 

转载于:https://www.cnblogs.com/ljy1227476113/p/9724547.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值