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和里面本身的某个东西冲突了,所以编译错了,后来改成 ...
随机推荐
- 2016年蓝桥杯省赛A组c++第4题(算法填空)
/* 排序在各种场合经常被用到. 快速排序是十分常用的高效率的算法. 其思想是:先选一个“标尺”, 用它把整个队列过一遍筛子, 以保证:其左边的元素都不大于它,其右边的元素都不小于它. 这样,排序问题 ...
- Copycat - Overview
Copycat’s primary role is as a framework for building highly consistent, fault-tolerant replicated s ...
- pip list 和 pip freeze
https://blog.csdn.net/vitaminc4/article/details/76576956 Pip’s documentation statespip descripti ...
- LeetCode 976 Largest Perimeter Triangle 解题报告
题目要求 Given an array A of positive lengths, return the largest perimeter of a triangle with non-zero ...
- python练习题-day1
1.使用while循环输入 1 2 3 4 5 6 8 9 10 count=0 while count<10: count+=1 if count==7: continue print ...
- linux 查看网卡流量:sar
sar(System Activity Reporter 系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,但我们一般用来监控网卡流量 # 安装 ...
- 关于ARMv8另外几个问题
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/qianlong4526888/article/details/27510675 问题1:支持ARMv ...
- HttpUrlConneciton上传JSON数据
try { //创建连接 URL url = new URL(url); HttpURLConnection connection = (HttpURLConnection) url.openConn ...
- Mac OSX上卸载Anaconda
方案一 anaconda安装程序在~/.bash_profile脚本中新添加了一行,将anaconda bin目录添加到了$PATH环境变量中.所以你只需要删除anaconda目录,但是最好也从安装脚 ...
- pycharm的小问题之光标
一大早起来,突然发现pycharm的光变粗,按退格键会删除编写的内容,超级难受(如下图), 百度一下,也不知道在百度框里输什么关键字好,但最后还是找到了,哈哈.... 解决方法: 1.按键盘上In ...