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

行数和列数都是偶数,能够选择空出一个(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. epoll IO多路复用(异步阻塞AIO)

    epoll的异步阻塞(AIO): 用户线程创建epoll后,其实是内核线程负责扫描 fd 列表(在网络服务器上可以是socket,socket在创建后返回的也是文件描述符),并填充事件链表.但是,并不 ...

  2. Android OKHttp网络框架

    好久没逛简书了.这周公司的项目也已经愉快的迭代了新版本,对于之前一直存留的东西一直没怎么梳理,今天想说说这两年特别火的网络框架.okhttp我想大部分Android开发者都不陌生,因为它的到来.是我们 ...

  3. Android常用依赖库搜集

    图片处理 CircleImageView Git地址:https://github.com/hdodenhof/CircleImageView 图片依赖库 glide Git地址:https://gi ...

  4. C#常见问题总结(三)

    11.sql比access好在哪里,为什么都用sql 解决方法: 数据量大,可以在服务器端,access一般在单机的时候用 12.c#基础视频教程有吗 解决方法: 零基础学C#这本书带全套C#基础视频 ...

  5. C++(变量类型-深入)

    变量类型 变量其实只不过是程序可操作的存储区的名称.C++ 中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上. 变量的名称可以由字母.数字 ...

  6. 《网络管理》IP地址管理与子网划分

    IP地址管理——ipmaster ipmaster是一款对IP地址进行管理的软件,使用该软件可以提高网络管理员的工作效率.在大型网络中,使用该软件可以有序且高效地实现大中小型企业网IP地址的分配和管理 ...

  7. HDU_2955_Robberies_01背包

    A - Robberies Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submi ...

  8. Java基础(五)--内部类

    内部类简单来说就是把一个类的定义放到另一个类的定义内部 内部类分为:成员内部类.局部内部类.匿名内部类.静态内部类 成员内部类:最常见的内部类 public class Outter { privat ...

  9. TP中U方法详解

    U方法常用于ThinkPHP里的页面跳转 官方称为url组装, 就是根据某种规则组成一个url地址,这个功能就叫组装. 在ThinkPHP里,系统提供了一个封装的函数来处理url的组装,俗称U方法. ...

  10. 10Oracle Database 数据表数据查询

    Oracle Database 数据表数据查询 DML 数据操纵语言 - 数据的查看和维护 select / insert /delete /update 基本查询语句 Select [distinc ...