多校第九场Travelling Salesman Problem总结

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5402

题意:n*m的矩阵格子,每个格子有相应的数字,上要从矩阵的左上角走到右下角,要求使得走过的数字之和尽可能多,同时每个格只能走一次,输出走过的数字之和,以及路径

思路:对于n,m任何一个是奇数,那么就能经过所有的格子,如果n,m两个数都是偶数,那么那么讲棋盘黑白染色,假设(1,1)和(n,m)都为黑色,那么这条路径中黑格个数比白格个数多1,而棋盘中黑白格子个数相同,所以必然有一个白格不会被经过,所以选择白格中权值最小的不经过。

构造方法是这样,首先RRRRDLLLLD这样的路径走到这个格子所在行或者上一行,然后DRUR这样走到这个格子的所在列或者前一列,然后绕过这个格子。然后走完这两行,接着按LLLLDRRRR这样的路径往下走。

代码:

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <cmath>

#include <ctime>

#include <iostream>

#include <algorithm>

#include <string>

#include <vector>

#define debug "output for debug\n"

#define pi (acos(-1.0))

#define eps (1e-8)

#define inf 0x3f3f3f3f

#define ll long long

using namespace std;

const int maxn = 100005;

int a[111][111];

int main()

{

int n,m;

int x,y;

while(scanf("%d%d",&n,&m)!=EOF)

{

int mi=inf;

ll sum=0;

for(int i=1;i<=n;i++)

for(int j=1;j<=m;j++)

{

scanf("%d",&a[i][j]);

sum+=a[i][j];

if((i+j)%2==1)

{

if(a[i][j]<mi)

{

mi=a[i][j];

x=i;

y=j;

}

}

}

if(n%2==1)

{

printf("%lld\n",sum);

for(int i=1;i<=n;i++)

{

if(i%2)

for(int j=2;j<=m;j++)printf("R");

else

for(int j=2;j<=m;j++)printf("L");

if(i!=n)

printf("D");

}

printf("\n");

}

else if(m%2)

{

printf("%lld\n",sum);

for(int i=1;i<=m;i++)

{

if(i%2)

for(int j=2;j<=n;j++)printf("D");

else

for(int j=2;j<=n;j++)printf("U");

if(i!=m)

printf("R");

}

printf("\n");

}

else

{

printf("%lld\n",sum-mi);

for(int i=1;i<(x+1)/2;i++)

{

for(int j=2;j<=m;j++)printf("R");

printf("D");

for(int j=2;j<=m;j++)printf("L");

printf("D");

}

for(int i=1;i<(y+1)/2;i++)

printf("DRUR");

if(x%2)

printf("DR");

else

printf("RD");

for(int i=(y+1)/2;i<m/2;i++)

printf("RURD");

for(int i=(x+1)/2;i<n/2;i++)

{

printf("D");

for(int j=2;j<=m;j++)printf("L");

printf("D");

for(int j=2;j<=m;j++)printf("R");

}

printf("\n");

}

}

return 0;

}

/*

4 4

2 2 2 2

1 2 2 2

2 2 2 2

2 2 2 2

4 4

2 1 2 2

2 2 2 2

2 2 2 2

2 2 2 2

4 4

2 2 2 1

2 2 2 2

2 2 2 2

2 2 2 2

4 4

2 2 2 2

2 2 1 2

2 2 2 2

2 2 2 2

4 4

2 2 2 2

2 2 2 2

2 1 2 2

2 2 2 2

4 4

2 2 2 2

2 2 2 2

2 2 2 1

2 2 2 2

4 4

2 2 2 2

2 2 2 2

2 2 2 2

1 2 2 2

*/

咦咦咦~wa了一发之后,试了几乎所有的样例、、、

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-16 01:33:14

多校第九场Travelling Salesman Problem总结的相关文章

多校9 1007 Travelling Salesman Problem

Travelling Salesman Problem Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 829    Accepted Submission(s): 182Special Judge Problem Description Teacher Mai is in a maze with n rows and m columns

HDU 4970 Killing Monsters 多校第九场1011

Problem Description Kingdom Rush is a popular TD game, in which you should build some towers to protect your kingdom from monsters. And now another wave of monsters is coming and you need again to know whether you can get through it. The path of mons

HDU 4968 Improving the GPA 多校第九场1009

Problem Description Xueba: Using the 4-Point Scale, my GPA is 4.0. In fact, the AVERAGE SCORE of Xueba is calculated by the following formula: AVERAGE SCORE = ∑(Wi * SCOREi) / ∑(Wi) 1<=i<=N where SCOREi represents the scores of the ith course and Wi

多校第九场:贪心+矩阵快速幂中间优化+线性递推&amp;线段树递推

HDU 4968 Improving the GPA 思路:贪心的搞吧!比赛的时候想了好久,然后才发现了点规律,然后乱搞1A. 因为贪心嘛!大的情况就是刚开始每个人的分数都是最大的最小值,即绩点4.0的最低分数85,然后最后一个数设为剩余的分数,然后如果小于60就从第一个分数补到这个分数来,然后最后一个分数还小于60,那就用第二个补--依次往下搞,那时我也不知道这样就搞出答案了,我还没证明这个对不对呢,哈哈. 小的情况:小的情况就是先假设每个人都是绩点最小的最大分数,即绩点2.0的最大分数69,

构造 - HDU 5402 Travelling Salesman Problem

Travelling Salesman Problem Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5402 Mean: 现有一个n*m的迷宫,每一个格子都有一个非负整数,从迷宫的左上角(1,1)到迷宫的右下角(n,m),并且使得他走过的路径的整数之和最大,问最大和为多少以及他走的路径. analyse: 首先,因为每个格子都是非负整数,而且规定每个格子只能走一次,所以为了使和尽可能大,必定是走的格子数越多越好.这样我们就需

hdu5402 Travelling Salesman Problem(棋盘染色+模拟)

题目: Travelling Salesman Problem Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 906    Accepted Submission(s): 331 Special Judge Problem Description Teacher Mai is in a maze with n rows and m c

HDOJ 5402 Travelling Salesman Problem 模拟

行数或列数为奇数就能够所有走完. 行数和列数都是偶数,能够选择空出一个(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

【HDOJ 5402】Travelling Salesman Problem

[HDOJ 5402]Travelling Salesman Problem 一开始以为是搜索 仔细画了画发现就一模拟 奇数行或奇数列的时候怎么走都能全走完 偶数行偶数列的时候就要挑了 . * . * . * * . * . * . . * . * . * * . * . * . 以4*6为例(如上图 星号可以保证不取其中一个可遍历完全图 点好的话就会连带一些星号 所以绕过星号中的最小值 是最佳遍历方式 输入的时候找到最小值并记录下行列 遍历到改行前以 右走到头 下 左走到头 下 右走到头这种方

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 Problem Description Teacher Mai is in a maze with n rows and m colum