这道题目并不是很难理解,题目大意就是求从第一列到最后一列的一个字典序最小的最短路,要求不仅输出最短路长度,还要输出字典序最小的路径。

这道题可以利用动态规划求解。状态定义为:

cost[i][j] = max{cost[i+1][j+k]+c[i][j]}(k=-1,0,1)

关于最短路长度的求法,我们可以通过上边的状态转移方程递推求解。cost代表从第i列到第c-1列的最短路,只要找出cost[0][j](j代表行号)中的最大值,我们得到的结果就是最短路。

我们已经得到了最短路的长度。下一步,我们应该如何输出完整的最短路路径。题目说了最短路可能有多个,并且要求输出字典序最小的最短路。

如何得到字典序最小的最短路?

要让字典序最小,那么我们的路径从最左列到最右列,每一列的行号应该尽可能的小。根据我们目前已知的条件,我们可以在第一列中找出属于最短路的最小行号(对应代码行31-34行)。至此我们得到正确路径的开端。然后我们需要去找这条路径上的对应下一列的行号。在这里我们就需要另外一个二维数组nexts(记录当前路径的下一个行号的最小值)。

如何确保是最小值?我们寻找当前状态时是按顺序寻找当前状态的最小值的,因此得到的第一个状态的最小值所对应的行号一定是我们所需要的最小行号。这里特别要注意最后一行的下一行是第一行 这个条件,我起初是按照以下方式去执行三种决策(直行,右上,右下):

                 for(int k = -;k<=;k++){
if(cost[(j+k+r)%r][i+] <t){
nexts[j][i] = (j+k+r)%r;
t = cost[(j+k+r)%r][i+];
}
}

在一般情况下,这处代码不会有问题。可是一旦最短路从跨越了边界,那么行的访问顺序就变得无序了(如r-1,0,1),因此需要一次排序。

完整代码如下:

 #include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <climits>
using namespace std;
int cost[][];
int C[][];
int nexts[][];
int main(){
int r,c;
while(~scanf("%d%d",&r,&c)){
for(int i = ; i < r; i++)
for(int j = ; j < c; j++)
scanf("%d",&C[i][j]);
for(int i = ;i<r;i++)cost[i][c] = ;
int first= ,ans = INT_MAX;
for(int i = c-;i >= ;i--){
for(int j = ; j < r; j++){
int t = INT_MAX;
int ks[] ={-,,};
ks[]=(j-+r)%r,ks[]=(j+r)%r,ks[]=(j++r)%r;
sort(ks,ks+);
for(int k = ;k<=;k++){
if(cost[ks[k]][i+] < t){
nexts[j][i] = ks[k];
t = cost[ks[k]][i+];
}
}
cost[j][i] = t + C[j][i] ;
if(i== && cost[j][i] < ans){
ans = cost[j][i];
first = j;
}
} }
int minn = INT_MAX;
cout << first + ;
for(int j = nexts[first][],i=; i < c;j=nexts[j][i],i++){
cout <<" "<< j + ;
}
for(int i = ;i<r;i++){
minn = min(minn,cost[i][]);
}
cout <<endl<< minn << endl;
}
return ;
}

uva 116 Unidirectional TSP(动态规划,多段图上的最短路)的更多相关文章

  1. UVa 116 单向TSP(多段图最短路)

    https://cn.vjudge.net/problem/UVA-116 题意:给出m行n列的整数矩阵,从第一列任何一个位置出发每次往右,右上或右下走一格,最终到达最后一列,要求经过的整数之和最小. ...

  2. uva 116 - Unidirectional TSP (动态规划)

    第一次做动规题目,下面均为个人理解以及个人方法,状态转移方程以及状态的定义也是依据个人理解.请过路大神不吝赐教. 状态:每一列的每个数[ i ][ j ]都是一个状态: 然后定义状态[ i ][ j ...

  3. uva 116 Unidirectional TSP (DP)

    uva 116 Unidirectional TSP Background Problems that require minimum paths through some domain appear ...

  4. uva 116 Unidirectional TSP【号码塔+打印路径】

    主题: uva 116 Unidirectional TSP 意甲冠军:给定一个矩阵,当前格儿童值三个方向回格最小值和当前的和,就第一列的最小值并打印路径(同样则去字典序最小的). 分析:刚開始想错了 ...

  5. UVA 116 Unidirectional TSP(dp + 数塔问题)

     Unidirectional TSP  Background Problems that require minimum paths through some domain appear in ma ...

  6. UVA 116 Unidirectional TSP(DP最短路字典序)

    Description    Unidirectional TSP  Background Problems that require minimum paths through some domai ...

  7. UVA - 116 Unidirectional TSP 多段图的最短路 dp

    题意 略 分析 因为字典序最小,所以从后面的列递推,每次对上一列的三个方向的行排序就能确保,数字之和最小DP就完事了 代码 因为有个地方数组名next和里面本身的某个东西冲突了,所以编译错了,后来改成 ...

  8. UVA - 116 Unidirectional TSP (单向TSP)(dp---多段图的最短路)

    题意:给一个m行n列(m<=10, n<=100)的整数矩阵,从第一列任何一个位置出发每次往右,右上或右下走一格,最终到达最后一列.要求经过的整数之和最小.第一行的上一行是最后一行,最后一 ...

  9. UVa - 116 - Unidirectional TSP

    Background Problems that require minimum paths through some domain appear in many different areas of ...

随机推荐

  1. jmeter 填写URL链接后 不能有多余的空格。

  2. nginx配置、域名、前端代码部署

    服务器上部署nginx,部署多个独立的代码,用nginx做域名映射的配置方法: 修改/usr/local/nginx/conf/nginx.conf文件,重点是最后一行,include /data/n ...

  3. vuex vue状态管理

    第一步安装vuex(安装在生产环境) npm install vuex 第二步 src下新建store文件夹 用来专门放状态管理,store文件夹下新建四个js文件 index.js  actions ...

  4. CentOS7 minimal 没有netstat命令

    在CentOS 7 minimal中使用netstat 时,发现显示如下,明显没有了netstat 命令 [root@localhost ~]# netstat -a -bash: netstat: ...

  5. iptables应用

    192.168.4.119 为本机的ip地址:每条链的规则是由上至下进行匹配,因此我们需要把范围小的规则放在上面以防被覆盖. 1)清空iptables默认规则,并自定义规则 [root@iptable ...

  6. Vue报错 [Vue warn]: Cannot find element

    在前端开发全面进入前端的时代 作为一个合格的前端开发工作者 框架是不可或缺的Vue React Anguar 作为前端小白,追随大佬的脚步来到来到博客园,更新现在正在学习的Vue 注 : 相信学习Vu ...

  7. php xml转数组 自定义xml_to_array

    <?php header("Content-type: text/xml; charset=utf-8"); $con = file_get_contents('xml路径' ...

  8. 静态栈抽象数据类型stack实现

    #include<stdio.h> #include<stdbool.h> #include<stdlib.h> #define MAX_STACK_SIZE 10 ...

  9. 完全数--Python

    如果一个数恰好等于它的因子之和,则称该数为“完全数” [1]  .各个小于它的约数(真约数,列出某数的约数,去掉该数本身,剩下的就是它的真约数)的和等于它本身的自然数叫做完全数(Perfect num ...

  10. LINQ巩固

    LINQ巩固 LINQ过滤运算符 Where 基于谓词函数过滤值 测试例子如下: public class TestModel { public string Name { get; set; } p ...