【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 ...
随机推荐
- div隐藏但是依然占位置
<!doctype html> <html> <head> <meta charset="utf-8"> <script ty ...
- 多任务-进程之进程池Pool
1.什么是池? 首先从字面上看,池代表着一个容器,用来承载着某些内容的容器,了解到这里,就对进程池有了一个初步的轮廓. 2.什么是进程池Pool? (1)利用现实中的事物来理解: 对于小白初学者,接触 ...
- rescan-scsi-bus.sh linux扫盘 脚本
[root@ftp:/home/tools/shell] > yum install sg3_utils* Loaded plugins: fastestmirror Repository ba ...
- 洛谷 P1990 覆盖墙壁
P1990 覆盖墙壁 题目描述 你有一个长为N宽为2的墙壁,给你两种砖头:一个长2宽1,另一个是L型覆盖3个单元的砖头.如下图: 0 0 0 00 砖头可以旋转,两种砖头可以无限制提供.你的任务是计算 ...
- 洛谷 P2049 魔术棋子
P2049 魔术棋子 题目描述 在一个M*N的魔术棋盘中,每个格子中均有一个整数,当棋子走进这个格子中,则此棋子上的数会被乘以此格子中的数.一个棋子从左上角走到右下角,只能向右或向下行动,请问此棋子走 ...
- 小贝_php源代码安装
PHP安装 一.本文档相关文件下载 二.php安装 一.本文档相关文件下载 1.php下载地址: http://php.net/downloads.php (备注: 本文档下载的是php版本号为ph ...
- BeautifulSoup的高级应用 之.parent .parents .next_sibling.previous_sibling.next_siblings.previous_siblings
继上一篇BeautifulSoup的高级应用,主要解说的是contents children descendants string strings stripped_strings.本篇主要解说.pa ...
- rpm -qf 的使用技巧,以及怎样查找软件包
首先查看安装的软件包,或者时候安装有某某软件包的命令 rpm (-qa)| grep 软件名 root@mode oldboy]# rpm -qa| grep openssl openssl-dev ...
- 小米净水器与小区过滤价格水对照.xls
总结:要是一天用水量为7升下面.还是用小区的过滤水为好,合算. 假设过滤水需求量大,可能小米的净水器比較好.当然,小区的要天天去接.要求风雨无阻的. 这点小米的随用随接就更好. 注意一点,小米的还要用 ...
- How to Download Windows 10 Spotlight/Lock Screen Images
http://www.online-tech-tips.com/windows-10/download-windows-10-spotlight-lock-screen-images/ 图片位置 C: ...