一道动态规划的编程题,请用C或C++编程(最好C++)

求任意两个城市间的最短距离,为方便问题描述,我们用下图来表示城市间的交通图,其中,图中的空心原点表示城市,边上的数字表示城市间的直达距离。

对上图我们做一些解释如下:

上图中共包含4个城市,城市的名称分别为0,1,2,3(我们统一用数字来表示城市名称),其中城市0到城市1的直达距离为1,城市1到城市2的直达距离为2,城市0和城市3之间因为直达路径,所以无直达距离。

另外,为便于理解,我们假定城市i与城市j的直达距离 等于 城市j到城市i的直达距离

【输入数据】

共三行

第一行是城市的个数N

第二行是是一个N*N的数组A, 用于保存两个城市之间的直达距离,如上图中,若A[1][2]=2表示城市1和城市2之间的距离是2,如果两个城市间没有直达的通路,则该元素的值为-1,如A[0][3] = -1

第三行是两个以空格分隔整数,分别代表两个城市名称。

【输出数据】

共两行

第一行是两个城市间的最短距离

第二行是两个城市间的最短距离所对应的路径

注意:

1. 如果两个城市之间没有路径相同,则直接输出提示信息 unreachable

2. 为便于测试,我们给出的测试数据中不会出现 两个城市间有多个最短路径的情况,即两个城市间的最短路径只可能有1条或者没有。

【输入样例1】

4

0 1 8 -1

1 0 2 -1

8 2 0 -1

-1 -1 -1 0

0 2

【输出样例1】

3 /*城市0到城市2的最短距离是3*/

0 1 2 /*城市0到城市2的最短距离对应的路径是0à1à2*/

【输入样例2】

4

0 1 8 -1

1 0 2 -1

8 2 0 -1

-1 -1 -1 0

0 3

【输出样例2】

unreachable /*城市0到城市3之间无路径可达*/

是图论题吧........
这个可以用Floyd-Warshall 算法
具体可以看http://www.nocow.cn/index.php/Floyd-Warshall%E7%AE%97%E6%B3%95
网上介绍的很多,这个算法就是用DP的
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-12-29
最小生成树。过两天写。留个记号

求ACM大侠。数字金字塔,要用到动态规划。最好用C++。谢谢!
\/\/程序是用c写的,稍微弄下就变c++了 include <stdio.h> long l[1002][1002]={0}; \/\/数组比较大,所以用全局的 int main(){ int i,j,n;long max=0; \/\/max用来存最大的路径和 scanf("%d",&n);for(i=1;i<=n;i++)for(j=1;j<=i;j++){ scanf("%ld",&l[i][j])...

C++最大值的问题(动态规划)(500财富悬赏)
申请一个二维数组dp[m][n],然后dp[i][j]的值表示从起点位置走到(i, j)位置能得到的最大累计值。那么第一行与第一列的走法就只有一种,比如到(0, 8)位置就是从起点一直向右走8步。之后对于任意dp[i][j] = max (dp[i - 1][j], dp[i][j - 1]) + value[i][j]value[i]...

c\\c++编程,图中圆圈都是数字,要求从上到下的数字和最大。穷举法就不要...
用自底向上的动态规划。具体来说,就是计算到从底层向上达每个节点时的最大和。要分层做:先做最底层,这是每个节点对应的最大和就是节点自身的值;然后倒数第二层,每个节点可以经由最底层的某两个节点到达,取最大的和自身相加;。。。;这样逐层向上,一直到最顶层。最后的时间复杂度是O(n),n...

最长公共子序列代码(C++)
最长公共子序列的C++实现在C++编程中,我们可以使用动态规划方法来解决最长公共子序列(LCS)问题。以下是一个简单的程序,它定义了必要的数据结构和函数来计算两个字符串之间的最长公共子序列。定义和全局变量首先,我们定义了一个名为dp的二维数组,大小为N+1xN+1,用于存储子问题的解。另外,我们还需...

一道C++程序题目求助
这好像是noip08的题目吧,解法是多进程动态规划,即把两次传纸条同时进行,状态为两张纸条的位置(可以优化为传的步数和两张纸条的横坐标),转移只需枚举纸条上一步是怎么传来的就可以了,附上我的ac代码(考试的时候我用的是c语言,c++你应该会改吧。。。)include <stdio.h> FILE *fp;int rec...

用动态规划求推箱子的最优路径 C语言的
动态规划,求推箱子游戏的最优路径,最好是用C语言的,没有的话JAVA或者C++的也行... 动态规划,求推箱子游戏的最优路径,最好是用C语言的,没有的话JAVA或者C++的也行 展开  我来答 2个回答 #热议# 生活中有哪些成瘾食物?匿名用户 2009-03-08

C++编程题:帮我理解一下这个代码
首先分析一下这个题目,题目分析清楚了,代码也就清楚了。我们假设摆2*N块砖有dig[n]中方法,根据下面的分析,我们可以dig[n]递归到dig[n-1]和dig[n-2]上,dig[n]可以分解为上图的三种摆法:1. 最后选一块2*1的砖,竖着放: 前面2*(N-1)块砖,一共有dig[n-1]种摆法 2. 最后选一...

C++动态规划经典案例解析之合并石子
石子合并II问题是在环形石子合并问题上的扩展,增加了合并方案的多样性。通过理解环形问题转换为线性问题,可以利用动态规划方法解决此问题。总结,解决区间类型问题的关键是利用动态规划方法减少重复计算,并通过问题分解找到最优解。通过实践和理解,可以更好地掌握动态规划在区间问题中的应用。

C++动态规划题 合并石子
在mincost函数里面,应该加上:if(m == n)return 0;\/\/下面的code是我刚写的递归的石子合并,可以参考\/\/如果有疑问,欢迎交流\/\/石子合并,递归version测试通过。#include<stdio.h>#define N 4int get_sum(int *tar, int n,int head, int tail){int cur_res = 0;int i;for(i = head; ...

一道C++编程题目,求大神帮忙,有没有简单点的算法,求程序!!答得好可以...
1.对于第八列,和计算完成后,不管找没找到值,寻找当前列下一行(即i+1),无需进入下一列;2.对于非第八列,有两种情况:a.和大于等于最大值10(如果矩阵中有零值存在,此处应为大于10),不满足路径条件,没必要进入下一列计算,进入当前列下一行进行计算(即i+1);b.满足条件,则进入下一...

相似回答
大家正在搜