uva 116 Unidirectional TSP(动态规划,多段图上的最短路)
这道题目并不是很难理解,题目大意就是求从第一列到最后一列的一个字典序最小的最短路,要求不仅输出最短路长度,还要输出字典序最小的路径。
这道题可以利用动态规划求解。状态定义为:
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(动态规划,多段图上的最短路)的更多相关文章
- UVa 116 单向TSP(多段图最短路)
https://cn.vjudge.net/problem/UVA-116 题意:给出m行n列的整数矩阵,从第一列任何一个位置出发每次往右,右上或右下走一格,最终到达最后一列,要求经过的整数之和最小. ...
- uva 116 - Unidirectional TSP (动态规划)
第一次做动规题目,下面均为个人理解以及个人方法,状态转移方程以及状态的定义也是依据个人理解.请过路大神不吝赐教. 状态:每一列的每个数[ i ][ j ]都是一个状态: 然后定义状态[ i ][ j ...
- uva 116 Unidirectional TSP (DP)
uva 116 Unidirectional TSP Background Problems that require minimum paths through some domain appear ...
- uva 116 Unidirectional TSP【号码塔+打印路径】
主题: uva 116 Unidirectional TSP 意甲冠军:给定一个矩阵,当前格儿童值三个方向回格最小值和当前的和,就第一列的最小值并打印路径(同样则去字典序最小的). 分析:刚開始想错了 ...
- UVA 116 Unidirectional TSP(dp + 数塔问题)
Unidirectional TSP Background Problems that require minimum paths through some domain appear in ma ...
- UVA 116 Unidirectional TSP(DP最短路字典序)
Description Unidirectional TSP Background Problems that require minimum paths through some domai ...
- UVA - 116 Unidirectional TSP 多段图的最短路 dp
题意 略 分析 因为字典序最小,所以从后面的列递推,每次对上一列的三个方向的行排序就能确保,数字之和最小DP就完事了 代码 因为有个地方数组名next和里面本身的某个东西冲突了,所以编译错了,后来改成 ...
- UVA - 116 Unidirectional TSP (单向TSP)(dp---多段图的最短路)
题意:给一个m行n列(m<=10, n<=100)的整数矩阵,从第一列任何一个位置出发每次往右,右上或右下走一格,最终到达最后一列.要求经过的整数之和最小.第一行的上一行是最后一行,最后一 ...
- UVa - 116 - Unidirectional TSP
Background Problems that require minimum paths through some domain appear in many different areas of ...
随机推荐
- JDBC连接数据库时错误提示的解决方案汇总
今天在连接JDBC时,出现了错误 最开始的URL是这样写的 Connection conn = DriverManager.getConnection("jdbc:mysql://local ...
- 在Win7虚拟机下搭建Hadoop2.6.0伪分布式环境
近几年大数据越来越火热.由于工作需要以及个人兴趣,最近开始学习大数据相关技术.学习过程中的一些经验教训希望能通过博文沉淀下来,与网友分享讨论,作为个人备忘. 第一篇,在win7虚拟机下搭建hadoop ...
- oracle-03 表的管理
一.表名和列名的命名规则1).必须以字母开头2).长度不能超过30个字符3).不能使用oracle的保留字4).只能使用如下字符 a-z,a-z,0-9,$,#等 二.数据类型1).字符类char 长 ...
- 邮件发送失败问题:Sending the email to the following server failed : smtp.qiye.163.com:25
[邮件发送错误] : Sending the email to the following server failed : smtp.qiye.163.com:25, {}org.apache.com ...
- 关于okHttp框架的使用
在之前的项目中,使用传统的HttpClient来返回一个图片信息流的时候总是报错,最后发现是因为传统的传输方式会对流的大小有限制,当超过某个值的时候就会报异常,最后决定使用OkHttp框架来解决这个问 ...
- Learning Experience of Big Data: Learn to install CentOs 6.5 on my laptop
I have learnt some experience about Big Data during my summer vocation,I was told that The first thi ...
- Python进阶-函数默认参数
Python进阶-函数默认参数 写在前面 如非特别说明,下文均基于Python3 一.默认参数 python为了简化函数的调用,提供了默认参数机制: def pow(x, n = 2): r = 1 ...
- python学习之对象的三大特性
在面向对象程序设计中,对象可以看做是数据(特性)以及由一系列可以存取.操作这些数据的方法所组成的集合.编写代码时,我们可以将所有功能都写在一个文件里,这样也是可行的,但是这样不利于代码的维护,你总不希 ...
- dot安装和使用
1.安装 apt-get install graphviz 如果报错说缺少依赖文件,则使用apt自动安装依赖项 apt-get -f install 我在安装中报错: dpkg: unrecovera ...
- 当安装mongodb客户端出现了Failed to load list of databases
在装mongodb最新版(4.1.5开发版)服务后,我用robo3t打开它的时候遇到了这个问题. 最直接的解决办法就是换一个mongodb版本,https://github.com/Studio3T/ ...