行数或列数为奇数就能够所有走完.

行数和列数都是偶数,能够选择空出一个(x+y)为奇数的点.

假设要空出一个(x+y)为偶数的点,则必须空出其它(x+y)为奇数的点

Travelling Salesman Problem

Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 747    Accepted Submission(s): 272

Special Judge

Problem Description
Teacher Mai is in a maze with n rows
and m columns.
There is a non-negative number in each cell. Teacher Mai wants to walk from the top left corner (1,1) to
the bottom right corner (n,m).
He can choose one direction and walk to this adjacent cell. However, he can't go out of the maze, and he can't visit a cell more than once.



Teacher Mai wants to maximize the sum of numbers in his path. And you need to print this path.
 
Input
There are multiple test cases.



For each test case, the first line contains two numbers n,m(1≤n,m≤100,n∗m≥2).



In following n lines,
each line contains m numbers.
The j-th
number in the i-th
line means the number in the cell (i,j).
Every number in the cell is not more than 104.
 
Output
For each test case, in the first line, you should print the maximum sum.



In the next line you should print a string consisting of "L","R","U" and "D", which represents the path you find. If you are in the cell (x,y),
"L" means you walk to cell (x,y−1),
"R" means you walk to cell (x,y+1),
"U" means you walk to cell (x−1,y),
"D" means you walk to cell (x+1,y).
 
Sample Input
3 3
2 3 3
3 3 3
3 3 2
 
Sample Output
25
RRDLLDRR
 
Author
xudyh
 
Source
 

/* ***********************************************
Author :CKboss
Created Time :2015年08月19日 星期三 13时43分44秒
File Name :HDOJ5402.cpp
************************************************ */ #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map> using namespace std; int n,m;
int g[110][110];
char dir[110][110]; char loop_down[4]={'R','D','L','D'};
char loop_up[4]={'R','U','L','U'}; void R(int &x,int &y) { y+=1; }
void L(int &x,int &y) { y-=1; }
void U(int &x,int &y) { x-=1; }
void D(int &x,int &y) { x+=1; } string road; string UP_TO_DOWN(int x,int y)
{
string midroad="";
memset(dir,'.',sizeof(dir));
dir[x][y]='$';
int curx=1,cury=1;
for(int i=1,id=0;i<2*n;i++,id++)
{
int nx=curx,ny=cury;
if(loop_down[id%4]=='R') R(nx,ny);
else if(loop_down[id%4]=='L') L(nx,ny);
else if(loop_down[id%4]=='U') U(nx,ny);
else if(loop_down[id%4]=='D') D(nx,ny); if(dir[nx][ny]=='.')
{
dir[curx][cury]=loop_down[id%4];
midroad+=dir[curx][cury];
curx=nx; cury=ny;
}
else if(dir[nx][ny]=='$')
{
dir[curx][cury]='D';
midroad+=dir[curx][cury];
D(curx,cury);
id=3;
}
}
midroad[midroad.length()-1]='R';
return midroad;
} string DOWN_TO_UP(int x,int y)
{
string midroad="";
memset(dir,'.',sizeof(dir));
dir[x][y]='$';
int curx=n,cury=1;
for(int i=1,id=0;i<2*n;i++,id++)
{
int nx=curx,ny=cury;
if(loop_up[id%4]=='R') R(nx,ny);
else if(loop_up[id%4]=='L') L(nx,ny);
else if(loop_up[id%4]=='U') U(nx,ny);
else if(loop_up[id%4]=='D') D(nx,ny); if(dir[nx][ny]=='.')
{
dir[curx][cury]=loop_up[id%4];
midroad+=dir[curx][cury];
curx=nx; cury=ny;
}
else if(dir[nx][ny]=='$')
{
dir[curx][cury]='U';
midroad+=dir[curx][cury];
U(curx,cury);
id=3;
}
}
midroad[midroad.length()-1]='R'; return midroad;
} void SHOW(int x,int y)
{
road="";
memset(dir,'.',sizeof(dir));
dir[x][y]='$';
if(y==1)
{
/// S road
int curx=1,cury=1,id=0;
for(int i=0;i<2*n-1;i++,id++)
{
int nx=curx,ny=cury;
if(loop_down[id%4]=='R') R(nx,ny);
else if(loop_down[id%4]=='L') L(nx,ny);
else if(loop_down[id%4]=='U') U(nx,ny);
else if(loop_down[id%4]=='D') D(nx,ny); if(dir[nx][ny]=='.')
{
dir[curx][cury]=loop_down[id%4];
road+=dir[curx][cury];
curx=nx; cury=ny;
}
else if(dir[nx][ny]=='$')
{
if(nx==n)
{
dir[curx][cury]='L';
road+=dir[curx][cury];
L(curx,cury);
}
else
{
dir[curx][cury]='D';
road+=dir[curx][cury];
D(curx,cury);
id=1;
}
}
}
road[road.length()-1]='R';
for(int i=3;i<=m;i++)
{
for(int j=1;j<n;j++)
{
if(i%2==0) road+='D';
else road+='U';
}
road+='R';
}
}
else
{
for(int i=1;i<y-1;i++)
{
for(int j=1;j<n;j++)
{
if(i%2==1) road+='D';
else road+='U';
}
road+='R';
}
if(y%2==0)
{
/// from up to down
road+=UP_TO_DOWN(x,2);
for(int i=y+1,id=0;i<=m;i++,id++)
{
for(int j=1;j<n;j++)
{
if(id%2==0) road+='U';
else road+='D';
}
road+='R';
}
}
else if(y&1)
{
/// from down to up
road+=DOWN_TO_UP(x,2);
for(int i=y+1,id=0;i<=m;i++,id++)
{
for(int j=1;j<n;j++)
{
if(id%2==0) road+='D';
else road+='U';
}
road+='R';
}
}
}
} int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout); while(scanf("%d%d",&n,&m)!=EOF)
{
int sum=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&g[i][j]);
sum+=g[i][j];
}
}
if(n&1)
{
printf("%d\n",sum);
for(int i=1;i<=n;i++)
{
for(int j=1;j<m;j++)
{
if(i&1) putchar('R');
else putchar('L');
}
if(i!=n) putchar('D');
}
putchar(10);
}
else if(m&1)
{
printf("%d\n",sum);
for(int i=1;i<=m;i++)
{
for(int j=1;j<n;j++)
{
if(i&1) putchar('D');
else putchar('U');
}
if(i!=m) putchar('R');
}
putchar(10);
}
else
{
int mi=999999999;
int px,py;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if((i+j)%2)
{
if(mi>g[i][j])
{
mi=min(mi,g[i][j]);
px=i; py=j;
}
}
}
}
printf("%d\n",sum-mi);
SHOW(px,py);
road[road.length()-1]=0;
cout<<road<<endl;
}
} return 0;
}

HDOJ 5402 Travelling Salesman Problem 模拟的更多相关文章

  1. hdoj 5402 Travelling Salesman Problem

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5402 类似于黑白棋盘,有的格子是可以不走的,有的格子是不能不走的,对于m或n中有一个奇数的情况, 所有 ...

  2. HDU 5402 Travelling Salesman Problem (模拟 有规律)(左上角到右下角路径权值最大,输出路径)

    Travelling Salesman Problem Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (J ...

  3. 构造 - HDU 5402 Travelling Salesman Problem

    Travelling Salesman Problem Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5402 Mean: 现有一 ...

  4. HDU 5402 Travelling Salesman Problem (构造)(好题)

    大致题意:n*m的非负数矩阵,从(1,1) 仅仅能向四面走,一直走到(n,m)为终点.路径的权就是数的和.输出一条权值最大的路径方案 思路:因为这是非负数,要是有负数就是神题了,要是n,m中有一个是奇 ...

  5. HDU 5402 Travelling Salesman Problem(多校9 模拟)

    题目链接:pid=5402">http://acm.hdu.edu.cn/showproblem.php?pid=5402 题意:给出一个n×m的矩阵,位置(i.j)有一个非负权值. ...

  6. hdu 5402 Travelling Salesman Problem(大模拟)

    Problem Description Teacher Mai ,) to the bottom right corner (n,m). He can choose one direction and ...

  7. HDU 5402 Travelling Salesman Problem(棋盘染色 构造 多校啊)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5402 Problem Description Teacher Mai is in a maze wit ...

  8. hdu 5402 Travelling Salesman Problem (技巧,未写完)

    题意:给一个n*m的矩阵,每个格子中有一个数字,每个格子仅可以走一次,问从(1,1)走到(n,m) 的路径点权之和. 思路: 想了挺久,就是有个问题不能短时间证明,所以不敢下手. 显然只要n和m其中一 ...

  9. HDU 5402 : Travelling Salesman Problem

    题目大意:n*m的格子,从左上角走到右下角,每个格子只能走一遍,每个格子上有一个非负数,要让途径的数字和最大,最后要输出路径 思路:显然茹果n,m有一个是奇数的话所有格子的数字都能被我吃到,如果都是偶 ...

随机推荐

  1. 总结MySQL中SQL语法的使用

    --where子句操作符: where子句操作符 = 等于 <> 不等于(标准语法) != 不等于(非标准语法,可移植性差) < 小于 <= 小于等于 > 大于 > ...

  2. 树莓派+百度api实现人脸识别

    title: 树莓派+百度api实现人脸识别 tags: 树莓派 date: 2018-5-31 20:06:00 --- 树莓派对接百度api 我以前玩安卓的时候一直用的讯飞的平台和api,对于百度 ...

  3. Fiddler——抓包工具的使用

    fiddler安装 pc端安装fiddler,自行从百度下载即可 Fiddler是强大且好用的Web调试工具之一,它能记录客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输 ...

  4. 携程transform放大效果

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. canvas一周一练 -- canvas绘制饼图(3)

    运行效果: <!DOCTYPE html> <html> <head> </head> <body> <canvas id=" ...

  6. Mysql导入导出大量数据的方法、备份恢复办法

    经常使用PHP+Mysql的朋友一般都是通过phpmyadmin来管理数据库的.日常的一些调试开发工作,使用phpmyadmin确实很方便.但是当我们需要导出几百兆甚至几个G的数据库时,phpmyad ...

  7. UI布局术语

    horizontal, vertical top, left, bottom, right UIEdgeInsets margin与padding Interpreting Values Values ...

  8. PHP--选择排序

    <?php /** * 选择排序(从小到大)的思想:每一次从待排序的数据中选出最小的,放在待排序的起始位置. */ $arr = array(23, 42, 21, 8, 4, 2, 3, 1) ...

  9. CF 429B B.Working out (四角dp)

    题意: 两个人一个从左上角一个从左下角分别开始走分别走向右下角和右上角,(矩阵每个格子有数)问到达终点后可以得到的最大数是多少,并且条件是他们两个相遇的时候那个点的数不能算 思路: 首先这道题如果暴力 ...

  10. [HNOI]2003 消防局的建立

    消防局的建立 本题地址:http://www.luogu.org/problem/show?pid=2279 题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料 ...