【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 ...
随机推荐
- span文本自动换行
.span{ word-wrap: break-word; word-break: break-all; overflow: hidden; }
- 强化学习(2)----Q-learning
1.Q-learning主要是Q表: 当前状态s1,接下来可以有两个动作选择,看电视a1和学习a2,对于agent人来说,可以根据reward来作出决策(Policy).目的就是得到奖励最大. Q-l ...
- (一)React再学习
新公司的技术栈是React,虽然之前对react大概过了一遍,但是自己没有实际落地过项目 再学习一遍react: 一.react全家桶 ·create-react-app ·组件化思维 ·JSX ·开 ...
- Base64编码字符串时数据量明显变大
那就是当把byte[]通过Convert.ToBase64String转换成Base64编码字符串时数据量明显变大 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码.它将需 ...
- IE模式下EasyUI Combobox无效问题
近期开发过程中遇到IE浏览器Combobox无法正常加载问题. 经过一番百度说IE渲染过快导致页面渲染完了easyUI Combobox还没有加载.设置延迟加载后依旧无效. 后将input标签的Cla ...
- docker mysql 文件挂载和MySQL字符集设置
原文:docker mysql 文件挂载和MySQL字符集设置 docker run -p 3306:3306 --name mysql -v /usr/local/mysql/my.cnf:/etc ...
- HTTP——状态码
(转载) 完整的 HTTP 1.1规范说明书来自于RFC 2616,你可以在http://www.talentdigger.cn/home/link.php?url=d3d3LnJmYy1lZGl0b ...
- Samurai's Stroke
题目链接 题意: 一个长度为L的木棍,有n个支点支撑,每一个点是一个int数.表示距离木棍左端点的距离.求在那些位置将木棍劈开能够使得至少有一个木棍掉下去,输出这些位置的长度 3 ≤ l ≤ 109; ...
- js 动画1
div速度 运动: 代码例如以下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...
- uva_127,栈以及vector的应用
参考自http://www.cnblogs.com/maqiang/archive/2012/05/02/2479760.html #include <iostream> #include ...