HDU 5402 Travelling Salesman Problem (模拟 有规律)(左上角到右下角路径权值最大,输出路径)
Travelling Salesman Problem
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 568 Accepted Submission(s): 200
Special Judge
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.
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.
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).
3 3
2 3 3
3 3 3
3 3 2
25
RRDLLDRR
题目大意:给出一个n*m的棋盘,每个小方格内有一个数值,问从左上角走到右下角。经过的方格的数值和最大是多少。(每个方格仅仅能走一次)
解题思路:
首先假设n为奇数或者m为奇数,那么显然能够遍历整个棋盘。
如果n,m都为偶数,那么将棋盘黑白染色,如果(1,1)和(n,m)都染为黑色。其它的与黑色相邻的方格染成白色,与白色方格相邻的染成黑色,那么这条路径中黑格个数比白格个数多1个。而棋盘中黑白格子个数同样,所以必定有一个白格不会被经过,所以选择白格中权值最小的不经过。
构造方法是这样,首先RRRRDLLLLD这种路径走到这个格子所在行或者上一行,然后DRUR这样走到这个格子的所在列或者前一列,然后绕过这个格子。然后走完这两行,接着按LLLLDRRRR这种路径往下走。
如上面所说;
当n或m为奇数时。棋盘的全部点都能够遍历。
当n和m都是偶数时(如上图),依照黑白涂色的方式。能够发现不管怎样选择路径,走过的黑块数都比红块数多一个,最佳路径则是仅仅有一个红块未走,选择红块值最小的就可以。
如果n*m的棋盘是依照1到n和1到m,那么红块所在的位置[i][j]是(i+j)是奇数(即i和j一个是奇数一个是偶数)。如果未走的位置是(x。y)
对于路径的输出能够分为两类,
第一类:x是偶数(y一定是奇数) 例如以下图:
从第1行究竟x-2行。假设是奇数行,一直R。最后一个D;假设是偶数行,一直L。最后一个D。
第x-1和第x行。假设是第y列,R;假设是奇数列,DR;假设是偶数列,UR,不管是奇数列还是偶数列最后一列都没有R。假设x等于n。到这里就结束了;假设x不等于n,D。
从第x+1行到第n行。假设是奇数行,一直L。最后一个D;假设是偶数行,一直R。最后一个D。不管是奇数行还是偶数行最后一行没有D。
第二类:y是偶数(x一定是奇数) 例如以下图
从第1列究竟y-2行,假设是奇数列,一直D。最后一个R;假设是偶数列,一直U,最后一个R。
第y - 1和第y列。假设是第x行。R。假设是奇数行,RD;假设是偶数行,LD,不管是奇数行还是偶数行最后一行都没有D。假设y等于m。到这里就结束了;假设y不等于m。R。
从第y + 1行到第m列,假设是奇数列。一直U,最后一个R;假设是偶数列,一直D,最后一个R。不管是奇数列还是偶数列最后一列没有R。
代码例如以下:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <sstream>
#include <fstream>
#include <limits.h>
#define debug "output for debug\n"
#define pi (acos(-1.0))
#define eps (1e-6)
#define inf (1<<28)
#define sqr(x) (x) * (x)
#define mod 1e9+7
using namespace std;
typedef long long ll;
typedef unsigned long long ULL; int main()
{
int i,j,k,x,y,n,m,ans,minx,a[120][120];
//freopen("dd4.txt","w",stdout);
while(~scanf("%d%d",&n,&m))
{
ans=0;
minx=9999999;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
ans+=a[i][j];
if((i+j)&1)
{
if(a[i][j]<minx)
{
minx=a[i][j];
x=i;
y=j;
} }
}
}
if(n&1)
{
printf("%d\n",ans);
for(i=1;i<=n;i++)
{
if(i&1)
{
for(j=1;j<m;j++)
printf("R");
}
else
{
for(j=1;j<m;j++)
printf("L");
}
if(i!=n)
printf("D");
}
printf("\n");
}
else if(m&1)
{
printf("%d\n",ans);
for(i=1;i<=m;i++)
{
if(i&1)
{
for(j=1;j<n;j++)
printf("D");
}
else
{
for(j=1;j<n;j++)
printf("U");
}
if(i!=m)
printf("R");
}
printf("\n");
}
else
{
printf("%d\n",ans-minx);
//printf("x=%d y=%d\n",x,y);
if(n==2&&m==2)
{
if(minx==a[1][2])
printf("DR\n");
else
printf("RD\n");
}
else
{
if(x%2==0)
{
for(i=1;i<x-1;i++)
{
for(j=1;j<m;j++)
{
if(i&1)
printf("R");//->
else
printf("L");//<-
}
printf("D");//V
}
for(j=1;j<=m;j++)
{
if(j<y)
{
if(j&1)
printf("D");
else
printf("U");
}
else if(j>y)
{
if(j&1)
printf("U");
else
printf("D");
}
if(j!=m)
printf("R");
}
if(x!=n)
printf("D");
for(i=x+1;i<=n;i++)
{
for(j=1;j<m;j++)
{
if(i&1)
printf("L");
else
printf("R");
}
if(i!=n)
printf("D");//V
}
printf("\n");
}
else if(y%2==0)
{
for(i=1;i<y-1;i++)
{
for(j=1;j<n;j++)
{
if(i&1)
printf("D");
else
printf("U");
}
printf("R");
}
for(i=1;i<=n;i++)
{
if(i<x)
{
if(i&1)
printf("R");
else
printf("L");
}
else if(i>x)
{
if(i&1)
printf("L");
else
printf("R");
}
if(i!=n)
printf("D");
}
if(y!=m)
printf("R");
for(i=y+1;i<=m;i++)
{
for(j=1;j<n;j++)
{
if(i&1)
printf("U");
else
printf("D");
}
if(i!=m)
printf("R");
}
printf("\n");
}
}
}
}
return 0;
}
HDU 5402 Travelling Salesman Problem (模拟 有规律)(左上角到右下角路径权值最大,输出路径)的更多相关文章
- 构造 - 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 (构造)(好题)
大致题意:n*m的非负数矩阵,从(1,1) 仅仅能向四面走,一直走到(n,m)为终点.路径的权就是数的和.输出一条权值最大的路径方案 思路:因为这是非负数,要是有负数就是神题了,要是n,m中有一个是奇 ...
- HDOJ 5402 Travelling Salesman Problem 模拟
行数或列数为奇数就能够所有走完. 行数和列数都是偶数,能够选择空出一个(x+y)为奇数的点. 假设要空出一个(x+y)为偶数的点,则必须空出其它(x+y)为奇数的点 Travelling Salesm ...
- 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(棋盘染色 构造 多校啊)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5402 Problem Description Teacher Mai is in a maze wit ...
- 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的矩阵,每个格子中有一个数字,每个格子仅可以走一次,问从(1,1)走到(n,m) 的路径点权之和. 思路: 想了挺久,就是有个问题不能短时间证明,所以不敢下手. 显然只要n和m其中一 ...
- HDU 5402 : Travelling Salesman Problem
题目大意: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 ...
随机推荐
- leetcode数学相关
目录 166分数到小数 169/229求众数 238除自身以外数组的乘积 69Sqrt(x) 求平方根 231Power of Two 166分数到小数 给定两个整数,分别表示分数的分子 numera ...
- Flink之流处理理论基础
目录 Introduction to Stateful Stream Processing Traditional Data Infrastructures Stateful Stream Proce ...
- PCB 后台自动系统集成与邮件推送实现
在PCB行业中,工程系统是主要数据生产者,而这些数据不仅仅给自己系统使用呀,我们需要将数据传递到各系统,才达到各系统共同协作的目的. 这里以问答方式对实现方式进行讲解.呵呵呵! 后台自动集成问题解答: ...
- unity3d引擎中slua的使用
SLua是开源软件,没有反射,没有额外GC,采用静态代码生成,可以用于游戏核心逻辑,完整支持4.6+ UI系统. 1.下载安装 http://www.slua.net/ https://github. ...
- 2-SAT的小总结(POJ 3683 POJ 3207)
记住几个最重要的公式: xANDy=0<=>(x=>y′)AND(y=>x′) xANDy=1<=>(x′=>x)AND(y′=>y) xORy=0&l ...
- 文字水平居中和垂直居中的CSS
首先选择一个需要显示文字的选择器,我这里选择的是微信小程序里面的<view>选择器,在其他语言(如html)的选择器里是一样的做法: <view class="btn-it ...
- SQL优化--使用 EXISTS 代替 IN 和 inner join来选择正确的执行计划
在使用Exists时,如果能正确使用,有时会提高查询速度: 1,使用Exists代替inner join 2,使用Exists代替 in 1,使用Exists代替inner join例子: 在一般写s ...
- 【SQL】INTERVAL YEAR TO MONTH 和 INTERVAL DAY TO SECOND
INTERVAL YEAR TO MONTH: 作为年和月的时间间隔存储 INTERVAL DAY TO SECOND: 作为天.小时.分和秒的时间间隔存储(DAY,HOUR,MINUTE,SECON ...
- 【Linux】七种文件类型
Linux中的七种文件类型 d 目录文件. l 符号链接(指向另一个文件). s 套接字文件. b 块设备文件,二进制文件. c 字符设备文件. p 命名管道文件. - 普通文件
- vim之快速跳转
光棍节啦, 淘东西的闲暇上来发vim旅途第一篇日志. 为什么呢? 因为今天是我媳妇的生日, 我用这种只有我知道的方式来纪念一下. ^_^, 宝宝生日快乐! 开篇先说明日志布局, vim学习记录连载中所 ...