HDU 5402 Travelling Salesman Problem(组合数学+构造)

原创 2015年11月18日 22:26:20

题意:给出一个n*m的棋盘,每个格子有一个非负权值,要求从左上角出发到达右下角,不能重复经过格子,要求权值最大并给出路径。

思路:因为格子的权值非负,我们肯定希望经过尽可能多的格子,首先发现如果行或列有一个为奇数那么就可以遍历所有格子。

现在的问题转化成为求出行列为偶数情况下的方案,假设棋盘由黑白格子交错组成,起点和终点为黑色,由棋盘染色问题可知这条路径上黑色格子肯定要比白色格子多一个,所以我们求出权值最小的白色格子然后不经过它即可。路径可以这样求出:首先把棋盘分成三部分,中间的一部分是去掉的白色格子所在的两列,上面和下面分别也是一部分,这样路径首先上面一部分和下面一部分是偶数行偶数列可以走直线,中间一部分可以采用drlr的方式前进,遇见去掉的格子单独处理即可。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#include<ctime>
#define eps 1e-6
#define LL long long
#define pii pair<int, int>
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;

const int MAXN = 110;
//const int INF = 0x3f3f3f3f;
int n, m;
int G[MAXN][MAXN];
void print_path1(int ans) {
	cout << ans << endl;
	int dir = 0;
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j < m; j++)
			if(!dir) putchar('R');
			else putchar('L');
		if(i<n) putchar('D');
		dir ^= 1;
	}
	puts("");
}
void print_path2(int ans) {
	cout << ans << endl;
	int dir = 0;
	for(int i = 1; i <= m; i++) {
		for(int j = 1; j < n; j++)
			if(!dir) putchar('D');
			else putchar('U');
		if(i<m) putchar('R');
		dir ^= 1;
	}
	puts("");
}
void print_path3(int ans, int x, int y) {
	cout << ans << endl;
	int dir = 0, tmp = (x&1) ? x : x-1;
	for(int i = 1; i < tmp; i++) {
		for(int j = 1; j < m; j++)
			if(!dir) putchar('R');
			else putchar('L');
		putchar('D');
		dir ^= 1;
	}
	int tmp2 = (y&1) ? y : y-1;
	for(int i = 1; i < tmp2; i+=2) printf("DRUR");
	if(x != tmp) {
        printf("RD");
        if(y<m-1) putchar('R');
	}
	else {
        printf("DR");
        if(y<m-1) putchar('R');
	}
	for(int i = tmp2+2; i < m; i+=2)
		if(i != m-1) printf("URDR");
		else printf("URD");
    if(tmp+2<=n) putchar('D');
	dir = 1;
	for(int i = tmp+2; i <= n; i++) {
		for(int j = 1; j < m; j++)
			if(!dir) putchar('R');
			else putchar('L');
		if(i<n) putchar('D');
		dir ^= 1;
	}
	puts("");
}
int main() {
	//freopen("input.txt", "r", stdin);
	int kase = 0; 
	while(cin >> n >> m) {
		int ans = 0;
		for(int i = 1; i <= n; i++) {
			for(int j = 1; j <= m; j++) {
				scanf("%d", &G[i][j]);
				ans += G[i][j];
			}
		}
		if(n&1) print_path1(ans);
		else if(m&1) print_path2(ans);
		else {
			int x, y, minv = 100000;
			for(int i = 1; i <= n; i++) {
				for(int j = 1; j <= m; j++) {
					if(((i+j)&1) && G[i][j]<minv) {
						minv = G[i][j];
						x = i;
						y = j;
					}
				}
			}
			print_path3(ans-minv, x, y);
		}
	}
    return 0;
}

















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

贪心解决:TSP问题(Travelling Salesman Problem)即旅行商问题

一、TSP问题 TSP问题(Travelling Salesman Problem)即旅行商问题,又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市...
  • hzw05103020
  • hzw05103020
  • 2015年11月13日 16:12
  • 7713

模拟退火算法_数学建模系列

对于那些受大自然的运行规律或者面向具体问题的经验、规则启发出来的方法,人们常常称之为启发式算法。模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状...
  • DearRita
  • DearRita
  • 2016年08月18日 03:09
  • 1040

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

Travelling Salesman Problem Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (J...
  • yanghuaqings
  • yanghuaqings
  • 2015年08月19日 10:44
  • 733

HDU 5402(Travelling Salesman Problem-构造矩阵对角最长不相交路径)

Travelling Salesman Problem Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (...
  • nike0good
  • nike0good
  • 2015年08月24日 19:45
  • 1208

Round Numbers--杨辉三角,组合数学

转载地址:http://www.cnblogs.com/lyy289065406/archive/2011/07/31/2122758.html 大致题意: 输入两个十进制正整数a和b,求闭区间 [a...
  • bless924295
  • bless924295
  • 2016年08月18日 21:35
  • 304

Travelling Salesman Problem看法和我感觉不错的解决思路

最近看数据结构,看到了tsp问题
  • xuan19900
  • xuan19900
  • 2014年11月23日 13:48
  • 69

HDU 2601An easy problem-素数的运用,暴力求解

An easy problem Time Limit: 3000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %...
  • qq_18661257
  • qq_18661257
  • 2015年07月28日 11:57
  • 964

学组合数学心得与题解(一)——组合计数

今天我在某网站上稍微学习了一下组合数学,准确来讲,今天就看了看组合计数,然后做了两道题,在这里主要跟大家分享一下我的学习心得。...
  • zhengzheng2002
  • zhengzheng2002
  • 2017年07月31日 21:24
  • 207

组合数学各种小定理

转自:http://www.oschina.net/code/snippet_203297_11313问题:求解组合数C(n,m),即从n个相同物品中取出m个的方案数,由于结果可能非常大,对结果模10...
  • qq_33184171
  • qq_33184171
  • 2016年05月22日 18:11
  • 591

组合数学--错排问题

错排问题,在IT面试笔试中都经常
  • sxh850297968
  • sxh850297968
  • 2014年10月11日 15:53
  • 976
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 5402 Travelling Salesman Problem(组合数学+构造)
举报原因:
原因补充:

(最多只允许输入30个字)