【HDU 5402】Travelling Salesman Problem(构造)
被某题卡SB了,结果这题也没读好。。。以为每一个格子能够有负数就当搜索做了。怎么想也搜只是去,后来发现每一个格子是非负数,那么肯定就是构造题。
题解例如以下:
首先假设nn为奇数或者mm为奇数,那么显然能够遍历整个棋盘。
如果n,mn,m都为偶数,那么讲棋盘黑白染色,如果(1,1)(1,1)和(n,m)(n,m)都为黑色,那么这条路径中黑格个数比白格个数多11,而棋盘中黑白格子个数同样,所以必定有一个白格不会被经过,所以选择白格中权值最小的不经过。
构造方法是这样,首先RRRRDLLLLD这种路径走到这个格子所在行或者上一行。然后DRUR这样走到这个格子的所在列或者前一列。然后绕过这个格子。
然后走完这两行,接着按LLLLDRRRR这种路径往下走。
这题须要说明一下为什么这么选,由于假设你选的不是 (i,j)互为奇偶的格子的话,肯定有其余的(i,j)互为奇偶的格子不能被走到。假设选择的话,仅仅有这一个格子不会被走到,所以依据贪心肯定要选这个格子了.
恩。。挺脑洞的一题。写起来倒是不难。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 105;
const int INF = (1 << 30);
int mat[maxn][maxn];
int n,m,sum,minv,posx,posy;
void special_solve(){
printf("%d\n",sum - minv);
if(!(posx & 1)){
for(int i = 0; i < posx; i++){
char c = i & 1 ? 'L' : 'R';
for(int j = 1; j < m; j++)
printf("%c",c);
printf("D");
}
int base = 0;
for(int i = 0; i < m; i++){
char c = (i + base) & 1 ? 'U' : 'D';
if(i != posy)
printf("%c",c);
else
base ++;
if(i < m - 1)
printf("R");
}
for(int i = posx + 2; i < n; i++){
printf("D");
char c = i & 1 ? 'R' : 'L';
for(int j = 1; j < m; j++)
printf("%c",c);
}
}
else{
for(int i = 0; i < posx - 1; i++){
char c = i & 1 ? 'L' : 'R';
for(int j = 1; j < m; j++)
printf("%c",c);
printf("D");
}
int base = 0;
for(int i = 0; i < m; i++){
char c = (i + base) & 1 ? 'U' : 'D';
if(i != posy)
printf("%c",c);
else
base ++;
if(i < m - 1)
printf("R");
}
for(int i = posx + 1; i < n; i++){
printf("D");
char c = i & 1 ? 'R' : 'L';
for(int j = 1; j < m; j++)
printf("%c",c);
}
}
}
int main(){
while(scanf("%d%d",&n,&m) != EOF){
sum = 0;
minv = INF;
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++){
scanf("%d",&mat[i][j]);
sum += mat[i][j];
if((i + j) & 1){
if(minv > mat[i][j]){
posx = i;
posy = j;
minv = mat[i][j];
}
}
}
if(n & 1){
printf("%d\n",sum);
for(int i = 0; i < n; i++){
char c = i & 1 ? 'L' : 'R';
for(int j = 1; j < m; j++)
printf("%c",c);
if(i != n - 1)
printf("D");
}
}
else if(m & 1){
printf("%d\n",sum);
for(int i = 0; i < m; i++){
char c = i & 1 ? 'U' : 'D';
for(int j = 1; j < n; j++)
printf("%c",c);
if(i != m - 1)
printf("R");
}
}
else
special_solve();
puts("");
}
return 0;
}
【HDU 5402】Travelling Salesman Problem(构造)的更多相关文章
- HDU 5402 Travelling Salesman Problem (构造)(好题)
大致题意:n*m的非负数矩阵,从(1,1) 仅仅能向四面走,一直走到(n,m)为终点.路径的权就是数的和.输出一条权值最大的路径方案 思路:因为这是非负数,要是有负数就是神题了,要是n,m中有一个是奇 ...
- 构造 - 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 (模拟 有规律)(左上角到右下角路径权值最大,输出路径)
Travelling Salesman Problem Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (J ...
- HDU 5402 Travelling Salesman Problem(棋盘染色 构造 多校啊)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5402 Problem Description Teacher Mai is in a maze wit ...
- HDU 5402 Travelling Salesman Problem(多校9 模拟)
题目链接:pid=5402">http://acm.hdu.edu.cn/showproblem.php?pid=5402 题意:给出一个n×m的矩阵,位置(i.j)有一个非负权值. ...
- hdu 5402 Travelling Salesman Problem(大模拟)
Problem Description Teacher Mai ,) to the bottom right corner (n,m). He can choose one direction and ...
- HDU 5402 : Travelling Salesman Problem
题目大意:n*m的格子,从左上角走到右下角,每个格子只能走一遍,每个格子上有一个非负数,要让途径的数字和最大,最后要输出路径 思路:显然茹果n,m有一个是奇数的话所有格子的数字都能被我吃到,如果都是偶 ...
- 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 ...
随机推荐
- UNIX系统高级编程——第六章-系统数据文件和信息-总结
口令文件: /* The passwd structure. */ struct passwd { char *pw_name; /* Username. */ char *pw_passwd; /* ...
- shell 特殊字符
shell 基础 # 当做注释的比较多 : 命令分隔符,在同一行上写两个或两个以上的命令 :: 是case 代码块的结束符 . 点作为文件名的一部分 隐藏文件 目录名 点是正则表达式中的匹配字符 '' ...
- 紫书 例题8-15 UVa 12174 (滑动窗口)
这道题就是给你一n长序列, 然后把这个序列按顺序分成很多段, 每段长s(最前面可以小于s, 只有第一段的后半段, 最后面也同样, 只有最后一段的前半段), 然后要求是每一段里面没有重复的数, 问你有几 ...
- 平凡主丛上的Yang-Mills理论
本文是复旦大学由丁青教授的暑期课程“Yang-Mills理论的几何及其应用”所作笔记,会有少许修正. 所需基础: 多元微积分学 微分方程(常微分方程,数学物理方程) 曲线曲面论(初等微分几何) 以下是 ...
- Mysql学习总结(26)——MySQL子查询
mysql中虽然有连接查询实现多表连接查询,但是连接查询的性能很差,因此便出现了子查询. 1.理论上,子查询可以出现在查询语句的任何位置,但实际应用中多出现在from后和where后.出现在from后 ...
- 小A点菜 水题 dp 背包
基本上还是01背包,首先注意必须正好花光钱,所以初始化时除了dp[0]以外其他都要设置成inf,然后因为求方案数,所以基本方程为dp[i] = dp[i-x] + dp[i],再根据inf进行一些特殊 ...
- HDU 5319
Painter Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Su ...
- java webproject中logback换配置文件的路径
本人小站点: http://51kxd.com/ 欢迎大家不开心的时候訪问訪问,调节一下心情 web.xml中配置: <!-- windows logback.xml文件跟web容器(比 ...
- duplicate报ORA-01017权限问题
duplicate报ORA-01017权限问题 环境: OS:RedHat EnterPrise Linux 5.8 x64 Cluster:Oracle Grid 11.2.0.4 Databa ...
- java学习记录笔记--继承,super,Object类
继承: Java中的继承是单继承的. 1.子类拥有父类的全部属性和方法. 可是属性和方法的修饰符不能使private. 2.能够复用父类的代码. 方法的重写须要满足的条件: a.返回值类型 b.方法名 ...