UVa-116 Unidirectional TSP 单向旅行商
题目
https://vjudge.net/problem/uva-116
分析
设d[i][j]为从(i,j)到最后一列的最小开销,则d[i][j]=a[i][j]+max(d[i+1][j+1],d[i-1][j+1])
参考数字三角形,用逆推的方法,先确定最后一列d[i][n-1]=a[i][n-1],再确定n-2列,此时d[i][n-2] = a[i][n-2]+min(d[i][n-1],d[i-1][n-1],d[i+1][n-1])
最终推出全部的d[i][j]后,第一列最小的d就是答案.
另外要求打印路径,因此建立一个数组next1[i][j],保存结点i,j之后的结点.
在逆推的时候,如果d[rows[k]][j+1]+a[i][j] < d[i][j] 就更新next1[i][j]=rows[k]
AC代码
#include "bits/stdc++.h"
using namespace std;
#define inf 0x3f3f3f3f
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);
int a[150][150], d[150][150], next1[150][150];
int ans = inf, first = 0, m, n, i, j, k;
while (cin >> m && m != - 1) {
cin >> n;
ans = inf;
//d[i][j]表示从i, j开始走可以经过的最小整数和
//因此可以知道最后一列d[i][n-1] = a[i][n-1]
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin >> a[i][j];
for (i = 0; i < m; i++)
d[i][n - 1] = a[i][n - 1]; //初始化最后一列
for (j = n - 2; j >= 0; j--) {
for (i = 0; i < m; i++) {
int rows[3] = {i, i - 1, i + 1};
if (i == 0) rows[1] = m - 1; //第一行与最后一行相邻
if (i == m - 1) rows[2] = 0;
sort(rows, rows + 3);
d[i][j] = inf;
for (k = 0; k < 3; k++) {
int v = a[i][j] + d[rows[k]][j + 1];
if(v < d[i][j]){
d[i][j] = v;//更新最短路
next1[i][j] = rows[k];//记录路径,只记录行,因为列是递增的
}
}
if(j ==0 && d[i][j] < ans){
ans = d[i][j];
first = i;
}
}
}
//因为上面是从n - 2列开始, 所以只有一列是要单独处理
if(n==1){
for(i=0;i<m;i++){
if(ans > a[i][0]){
ans = a[i][0];
first = i;
}
}
}
cout << first + 1;
for(int i=next1[first][0], j=1; j<n; i = next1[i][j],j++){
cout << ' ' << i+1;
}
cout << endl << ans << endl;
}
return 0;
}
UVa-116 Unidirectional TSP 单向旅行商的更多相关文章
- 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 (单向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 ...
- UVA 116 Unidirectional TSP 经典dp题
题意:找最短路,知道三种行走方式,给出图,求出一条从左边到右边的最短路,且字典序最小. 用dp记忆化搜索的思想来考虑是思路很清晰的,但是困难在如何求出字典序最小的路. 因为左边到右边的字典序最小就必须 ...
- UVa 116 Unidirectional TSP (DP)
该题是<算法竞赛入门经典(第二版)>的一道例题,难度不算大.我先在没看题解的情况下自己做了一遍,虽然最终通过了,思路与书上的也一样.但比书上的代码复杂了很多,可见自己对问题的处理还是有所欠 ...
- UVA - 116 Unidirectional TSP 多段图的最短路 dp
题意 略 分析 因为字典序最小,所以从后面的列递推,每次对上一列的三个方向的行排序就能确保,数字之和最小DP就完事了 代码 因为有个地方数组名next和里面本身的某个东西冲突了,所以编译错了,后来改成 ...
随机推荐
- [报错]ios开发 failed to read file attributes for
下载第三方demo,运行报错: failed to read file attributes for https://stackoverflow.com/questions/46301270/fa ...
- ORA-00054:resource busy and acquire with nowait specified解决方法
1.用dba权限的用户查看数据库都有哪些锁 SELECT T2.USERNAME,T2.SID,T2.SERIAL#,T2.LOGON_TIME FROM V$LOCKED_OBJECT ...
- Beanstalkd 基本概念和使用
1:什么是 Beanstalkd ? Beanstalkd 一个高性能.轻量级的分布式内存队列系统 简单来说,就是一个队列,相比于 数据库/redis 队列相比. 更专业.能完成的功能更多.就这么理解 ...
- pandas基础
1.相关库导入 2.创建数据结构 pandas 有两个重要的数据结构: Series 和 DataFrame 创建Series数组,代表一行或一列 创建DataFrame ,代表二维数组 第一种方式: ...
- centos所有版本下载源
http://ftp.sjtu.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1511.iso http://mirrors.yun-idc.com/ ...
- java JDBC (六) org.apache.commons.dbutils 增删改
dbutils是apache封装了JDBC的工具类,比mysql-connector更方便些 下载地址:http://commons.apache.org/proper/commons-dbutils ...
- java 线程(五)线程安全 Lock接口
package cn.sasa.demo3; import java.util.concurrent.ExecutionException; public class ThreadDemo { pub ...
- Hibernate的一个小应用
hibernate 第一步,导入hiberante需要用到的jar包,因为使用hibernate时候,有日志信息输出,hibernate本身没有日志输出的jar包,导入其他日志的jar包 不要忘记还有 ...
- 【托业】【新托业TOEIC新题型真题】学习笔记8-题库五->P7
———————————————————单词———————————————————— minister 部长 construction contractor 施工方 commence 开始:着手 bac ...
- hibernate 主键生成方式
1)assigned主键由外部程序负责生成,无需Hibernate参与. 2)hilo通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态. 3)seqhilo与hilo 类 ...