UVA - 116 Unidirectional TSP (单向TSP)(dp---多段图的最短路)
题意:给一个m行n列(m<=10, n<=100)的整数矩阵,从第一列任何一个位置出发每次往右,右上或右下走一格,最终到达最后一列。要求经过的整数之和最小。第一行的上一行是最后一行,最后一行的下一行是第一行。输出路径上每列的行号。多解时输出字典序最小的。
分析:
1、dp[i][j]---从第i行第j列到最后一列的最小开销。
2、列从右到左,从后一个状态可推知前一个状态的开销。
#pragma comment(linker, "/STACK:102400000, 102400000")
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define Min(a, b) ((a < b) ? a : b)
#define Max(a, b) ((a < b) ? b : a)
const double eps = 1e-8;
inline int dcmp(double a, double b){
if(fabs(a - b) < eps) return 0;
return a > b ? 1 : -1;
}
typedef long long LL;
typedef unsigned long long ULL;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const int MOD = 1e9 + 7;
const double pi = acos(-1.0);
const int MAXN = 100 + 10;
const int MAXT = 10000 + 10;
using namespace std;
int a[20][MAXN];
int dp[20][MAXN];
int path[20][MAXN];//当前位置的下一列所对应行数
int main(){
int m, n;
while(scanf("%d%d", &m, &n) == 2){
memset(dp, INT_INF, sizeof dp);
memset(path, 0, sizeof path);
for(int i = 1; i <= m; ++i){
for(int j = 1; j <= n; ++j){
scanf("%d", &a[i][j]);
}
}
for(int i = 1; i <= m; ++i) dp[i][n] = a[i][n];
for(int j = n - 1; j >= 1; --j){
for(int i = 1; i <= m; ++i){
int tmp[] = {i - 1, i, i + 1};
if(i == 1) tmp[0] = m;
if(i == m) tmp[2] = 1;
sort(tmp, tmp + 3);
for(int k = 0; k < 3; ++k){
int &cur = tmp[k];
if(a[i][j] + dp[cur][j + 1] < dp[i][j]){//保证字典序最小
dp[i][j] = a[i][j] + dp[cur][j + 1];
path[i][j] = cur;
}
}
}
}
int ans = INT_INF;
int st = 0;
for(int i = 1; i <= m; ++i){
if(dp[i][1] < ans){
ans = dp[i][1];
st = i;//第一列行数
}
}
printf("%d", st);
for(int j = 2; j <= n; ++j){
printf(" %d", path[st][j - 1]);
st = path[st][j - 1];
}
printf("\n");
printf("%d\n", ans);
}
return 0;
}
UVA - 116 Unidirectional TSP (单向TSP)(dp---多段图的最短路)的更多相关文章
- 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记忆化搜索的思想来考虑是思路很清晰的,但是困难在如何求出字典序最小的路. 因为左边到右边的字典序最小就必须 ...
- UVA - 116 Unidirectional TSP 多段图的最短路 dp
题意 略 分析 因为字典序最小,所以从后面的列递推,每次对上一列的三个方向的行排序就能确保,数字之和最小DP就完事了 代码 因为有个地方数组名next和里面本身的某个东西冲突了,所以编译错了,后来改成 ...
- UVa 116 Unidirectional TSP (DP)
该题是<算法竞赛入门经典(第二版)>的一道例题,难度不算大.我先在没看题解的情况下自己做了一遍,虽然最终通过了,思路与书上的也一样.但比书上的代码复杂了很多,可见自己对问题的处理还是有所欠 ...
- UVa - 116 - Unidirectional TSP
Background Problems that require minimum paths through some domain appear in many different areas of ...
- uva 116 - Unidirectional TSP (动态规划)
第一次做动规题目,下面均为个人理解以及个人方法,状态转移方程以及状态的定义也是依据个人理解.请过路大神不吝赐教. 状态:每一列的每个数[ i ][ j ]都是一个状态: 然后定义状态[ i ][ j ...
随机推荐
- CSS 常用操作
1.对齐 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...
- ZB本地设置
(1)web.config <!--本地服务器--> <add name="connectionString" connectionString="mG ...
- 华为轮值CEO,富士康却坚持独裁,二者究竟有什么不一样?
谈到深圳龙华的大企业,人们会很自然地想到华为和富士康,两家公司毗邻,有两个门仅仅隔着一条马路,都是世界500强,对国家,对社区的经济发展有着重要贡献,员工压力最大的时候,也都出现过自杀的情况,一个讲究 ...
- emWin 模拟器环境搭建
转载http://www.nxpic.org/module/forum/thread-609329-1-1.html 这个模拟器工程在Segger官网下载:https://www.segger.com ...
- js 保留两位小数 input要求是数字框,
要求:input文本框只能输入数字,且只保留两位小数 问题:若设置input的 type="number" ,js处理部分若用到parseFloat方法处理,结果是string类 ...
- 101、Java中String类之判断是否由数字组成
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 前端学习笔记系列一:3 Vue中的nextTick
一.示例 先来一个示例了解下关于Vue中的DOM更新以及nextTick的作用. 模板 <div class="app"> <div ref="msgD ...
- Python 动态从文件中导入类或函数的方法
假设模块文件名是data_used_to_test.py,放在tests文件夹下 文件夹结构如下: project |-tests |-data_used_to_test.py 文件内包含一个test ...
- DEDE后台升级后不显示编辑器
dede5.7不显示编辑器不能编辑文章的解决办法:进入系统后台系统配置-系统基本参数-核心设置将fck换成ckeditor保存,当然需要fck编辑器也可以到dede官网下载.dede5.7不显示编辑器 ...
- P1071 小赌怡情
P1071 小赌怡情 转跳点: