多校第九场Travelling Salesman Problem总结
来源:互联网 发布:admui 源码下载 编辑:程序博客网 时间:2024/05/16 11:41
题目链接: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了一发之后,试了几乎所有的样例、、、
- 多校第九场Travelling Salesman Problem总结
- 2015多校第九场 HDU 5402 Travelling Salesman Problem 棋盘染色法,构造
- hdu5402 Travelling Salesman Problem
- hdu5402 Travelling Salesman Problem
- <OJ_Sicily>Travelling Salesman Problem
- HDU 5402 Travelling Salesman Problem
- 【HDOJ 5402】Travelling Salesman Problem
- HDU 5402 Travelling Salesman Problem
- hdu 5402 Travelling Salesman Problem
- hdu 5402 Travelling Salesman Problem
- hdu 5402 Travelling Salesman Problem
- HDU5402 Travelling Salesman Problem 【模拟】
- HDU 5402 Travelling Salesman Problem(棋盘黑白染色)——多校练习9
- hdu 5402 ,Travelling Salesman Problem,2015多校联合训练赛#9
- HDU 5402 Travelling Salesman Problem (2015 Multi-University Training Contest 9 2015多校联合)
- Travelling Salesman Problem (hdu 5402 模拟)
- HDU-5402 Travelling Salesman Problem(模拟)
- 【HDU 5402】Travelling Salesman Problem(构造)
- 第三方QQ、微博登陆
- (Android)在SQLite中使用事务
- 采用<union-subclass>元素的继承映射
- 负数的二进制表示方法
- HOG特征-理解篇
- 多校第九场Travelling Salesman Problem总结
- 1.Swift初探
- android 代码混淆后出现:TypeReference constructed without actual type information这个错误的解决方法
- 腾讯电面——C/C++基础之关键字
- 系统测试策略
- mysql学习笔记
- 【Android应用开发技术:应用组件】Android事件处理机制
- Win10系统 JDK环境变量配置方法
- 迅雷快鸟的原理-可能