HDU 5402 模拟 构造 Travelling Salesman Problem
题意:
有一个n * m的数字矩阵,每个格子放着一个非负整数,从左上角走到右下角,每个格子最多走一次,问所经过的格子的最大权值之和是多少,并且输出一个路径。
分析:
如果n和m有一个是偶数的话,那么只要按照蛇形的走法一直走下去即可。
比如n为奇数的时候就这样,左右左右地蛇形走。
同样的,如果m为奇数的时候,也可以上下上下地蛇形走。
但如果n和m都为偶数的时候,就会无法走完全部的格子,最终到达右下角。
但是可以少走一个格子,而且这个格子必须是那种行标加列标为奇数的格子才行(行和列从1开始),所以我们就绕过权值最小的符合条件的格子,走其他所有的格子获得最大值。
比如像这种:
除了那个选出来的格子不走,其余的格子可以全部走到。
所以就直接这样构造出一条路径出来。
我们可以这样构造,假设选出来的不走的格子为(x, y),把这个地图分成三部分:选第x行和相邻的一行,这两个作为一个「长城」的走法。
然后「长城」上面和下面用蛇字形走法,最后走到右下角。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = + ; int n, m, sum, _min;
int a[maxn][maxn]; int r, c; bool vis[maxn][maxn]; void snake(int n, int m, char d, char revd, char nxt)
{
for(int i = ; i <= n; i++)
{
if(i & )
{
for(int j = ; j < m; j++) printf("%c", d);
if(i < n) printf("%c", nxt);
}
else
{
for(int j = ; j < m; j++) printf("%c", revd);
if(i < n) printf("%c", nxt);
}
}
} int main()
{
while(scanf("%d%d", &n, &m) == && n)
{
sum = ;
_min = ;
for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++)
{
scanf("%d", &a[i][j]);
sum += a[i][j];
if(((i + j) & ) && a[i][j] < _min) { _min = a[i][j]; r = i; c = j; }
} if(n & )
{
printf("%d\n", sum);
snake(n, m, 'R', 'L', 'D');
puts("");
continue;
} if(m & )
{
printf("%d\n", sum);
snake(m, n, 'D', 'U', 'R');
puts("");
continue;
} printf("%d\n", sum - _min); if(r - > ) snake(r - , m, 'R', 'L', 'D');
if(r - > ) printf("D"); int x, y, up, down;
if(r <= )
{
x = y = ;
up = , down = ;
}
else
{
up = r - , down = r;
x = r - ;
if(r & ) y = m; else y = ;
} memset(vis, false, sizeof(vis));
for(int i = ; i <= n + ; i++) vis[i][] = vis[i][m + ] = true;
for(int i = ; i <= m + ; i++) vis[][i] = vis[n + ][i] = true;
vis[x][y] = true;
vis[r][c] = true;
if(y == )
{
for(int i = ; i <= m * - ; i++)
{
if(x == down)
{
if(!vis[x-][y]) { x--; vis[x][y] = true; printf("U"); }
else { y++; vis[x][y] = true; printf("R"); }
}
else
{
if(!vis[x+][y]) { x++; vis[x][y] = true; printf("D"); }
else { y++; vis[x][y] = true; printf("R"); }
}
}
}
else
{
for(int i = ; i <= m * - ; i++)
{
if(x == down)
{
if(!vis[x-][y]) { x--; vis[x][y] = true; printf("U"); }
else { y--; vis[x][y] = true; printf("L"); }
}
else
{
if(!vis[x+][y]) { x++; vis[x][y] = true; printf("D"); }
else { y--; vis[x][y] = true; printf("L"); }
}
}
} if(down + <= n)
{
printf("D");
if(y == ) snake(n - down, m, 'R', 'L', 'D');
else snake(n - down, m, 'L', 'R', 'D');
} puts("");
} return ;
}
代码君
HDU 5402 模拟 构造 Travelling Salesman Problem的更多相关文章
- 构造 - HDU 5402 Travelling Salesman Problem
Travelling Salesman Problem Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5402 Mean: 现有一 ...
- HDU 5402 Travelling Salesman Problem (构造)(好题)
大致题意:n*m的非负数矩阵,从(1,1) 仅仅能向四面走,一直走到(n,m)为终点.路径的权就是数的和.输出一条权值最大的路径方案 思路:因为这是非负数,要是有负数就是神题了,要是n,m中有一个是奇 ...
- HDU 5402 Travelling Salesman Problem (模拟 有规律)(左上角到右下角路径权值最大,输出路径)
Travelling Salesman Problem Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (J ...
- HDOJ 5402 Travelling Salesman Problem 模拟
行数或列数为奇数就能够所有走完. 行数和列数都是偶数,能够选择空出一个(x+y)为奇数的点. 假设要空出一个(x+y)为偶数的点,则必须空出其它(x+y)为奇数的点 Travelling Salesm ...
- PAT-1150(Travelling Salesman Problem)旅行商问题简化+模拟图+简单回路判断
Travelling Salesman Problem PAT-1150 #include<iostream> #include<cstring> #include<st ...
- PAT A1150 Travelling Salesman Problem (25 分)——图的遍历
The "travelling salesman problem" asks the following question: "Given a list of citie ...
- PAT 甲级 1150 Travelling Salesman Problem
https://pintia.cn/problem-sets/994805342720868352/problems/1038430013544464384 The "travelling ...
- 1150 Travelling Salesman Problem(25 分)
The "travelling salesman problem" asks the following question: "Given a list of citie ...
- PAT_A1150#Travelling Salesman Problem
Source: PAT A1150 Travelling Salesman Problem (25 分) Description: The "travelling salesman prob ...
随机推荐
- Spring RestTemplate实现服务间的远程调用完整代码示例
父pom: 服务提供方 pom: provider配置文件: provider启动类: provider实体类: provider Mapper: 内置了增删改查的方法 provider Servic ...
- JAVA---spring-boot入门(图文教程)
Spring Boot可以轻松创建独立的,生产级的基于Spring的应用程序,他的特征: 1.创建独立的Spring应用程序 2.直接嵌入Tomcat,Jetty或Undertow(无需部 ...
- Dubbo 使用rest协议发布http服务
演示用GitHub地址:https://github.com/suyin58/dubbo-rest-example 1 Dubbo_rest介绍 Dubbo自2.6.0版本后,合并了dub ...
- css简单动画
这几天公司需要更新一个移动端web的页面,因为任务简单,就交给作为菜鸟新人的我来做.第一次接触css还是在14年刚上大一的时候跟着html一起学习的,之后就再也没有接触过.所以只好一边学习,一边完成任 ...
- 零基础逆向工程18_PE结构02_联合体_节表_PE加载过程
联合体 特点 1.联合体的成员是共享内存空间的 2.联合体的内存空间大小是联合体成员中对内存空间大小要求最大的空间大小 3.联合体最多只有一个成员有效 节表数据结构说明 PE 加载 过程 FileBu ...
- SlickEdit 18.0 版本发布 同时更新破解文件
18.0版本没有太大的惊喜 多了如下功能 Multiple Document Group Interface Repository Log Browser History Diff Support f ...
- 重写strcat函数,以实现strcat的功能
char * strcatTest(char *dst,const char *src);Action(){ char a[]="come on"; char b[]=" ...
- UOJ#7 NOI2014 购票 点分治+凸包二分 斜率优化DP
[NOI2014]购票 链接:http://uoj.ac/problem/7 因为太麻烦了,而且暴露了我很多学习不扎实的问题,所以记录一下具体做法. 主要算法:点分治+凸包优化斜率DP. 因为$q_i ...
- UVA 1609 Foul Play 不公平竞赛 (构(luan)造(gao)+递归)
题意:有n支队伍(n是2的整数幂,2<=n<=4),打淘汰赛,胜者进入下一轮,其中1号队伍能打败至少一半的队伍,对于它不能打败的队伍l,一定存在一支它能够打败的队伍w,使得w能直接打败l, ...
- 2018.5.13 oracle遇到的问题
安装Oracle 11g 出现交换空间不够 在计算机那里右键打开属性进入高级系统设置然后找到第一个设置找到高级然后更改一下自定义范围(云服务器是16-10000) 然后确定 完成了. 快安装结束之后显 ...