HDU 5067 Harry And Dig Machine:TSP(旅行商)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5067
题意:
给你一个n*m的地图,地图上标着对应位置的石子数。你从左上角出发,每次可以向上下左右四个方向移动。你要遍历所有有石子的地方,并返回起点。问你最少的移动步数。
题解:
简化问题:
只保留起点和有石子的点,预处理出保留点两两之间的最短路(曼哈顿距离),将矩阵转化为一个无向图。
原题变为了TSP模板题。
然后套模板就好了。。。
三重for循环,分别枚举state、当前位置i、下一步位置j。
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAX_N 55
#define MAX_S (1<<15)
#define INF 10000000 using namespace std; int n,m;
int cnt;
int ans;
int x[MAX_N];
int y[MAX_N];
int dis[MAX_N][MAX_N];
int dp[MAX_S][MAX_N]; void read()
{
cnt=;
int temp;
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
cin>>temp;
if(temp> || (i== && j==))
{
x[cnt]=i;
y[cnt]=j;
cnt++;
}
}
}
} void cal_dis()
{
for(int i=;i<cnt;i++)
{
for(int j=;j<cnt;j++)
{
dis[i][j]=fabs(x[i]-x[j])+fabs(y[i]-y[j]);
}
}
} void solve()
{
cal_dis();
memset(dp,-,sizeof(dp));
dp[][]=;
for(int state=;state<(<<cnt);state++)
{
for(int i=;i<cnt;i++)
{
if(dp[state][i]!=-)
{
for(int j=;j<cnt;j++)
{
if( !((state>>j)&) && (dp[state|(<<j)][j]==- || dp[state|(<<j)][j]>dp[state][i]+dis[i][j]) )
{
dp[state|(<<j)][j]=dp[state][i]+dis[i][j];
}
}
}
}
}
ans=INF;
for(int i=;i<cnt;i++)
{
if(dp[(<<cnt)-][i]!=-) ans=min(ans,dp[(<<cnt)-][i]+dis[i][]);
}
} void print()
{
cout<<ans<<endl;
} int main()
{
while(cin>>n>>m)
{
read();
solve();
print();
}
}
HDU 5067 Harry And Dig Machine:TSP(旅行商)的更多相关文章
- HDU 5067 Harry And Dig Machine(状压dp)
HDU 5067 Harry And Dig Machine 思路:因为点才10个,在加上一个起点,处理出每一个点之间的曼哈顿距离,然后用状压dp搞,状态表示为: dp[i][s],表示在i位置.走过 ...
- HDU 5067 Harry And Dig Machine(状压DP)(TSP问题)
题目地址:pid=5067">HDU 5067 经典的TSP旅行商问题模型. 状压DP. 先分别预处理出来每两个石子堆的距离.然后将题目转化成10个城市每一个城市至少经过一次的最短时间 ...
- hdu 5067 Harry And Dig Machine (状态压缩dp)
题目链接 bc上的一道题,刚开始想用这个方法做的,因为刚刚做了一个类似的题,但是想到这只是bc的第二题, 以为用bfs水一下就过去了,结果MLE了,因为bfs的队列里的状态太多了,耗内存太厉害. 题意 ...
- hdu 5067 Harry And Dig Machine
http://acm.hdu.edu.cn/showproblem.php?pid=5067 思路:问题可以转化成:从某一点出发,遍历网格上的一些点,每个点至少访问一次需要的最小时间是多少.这就是经典 ...
- hdu5067Harry And Dig Machine(TSP旅行商问题)
题目链接: huangjing 题意:给出一幅图.图中有一些点,然后从第1个点出发,然后途径全部有石头的点.最后回到原点,然后求最小距离.当初作比赛的时候不知道这就是旅行商经典问题.回来学了一下. 思 ...
- BestCoder Round #14 B 称号 Harry And Dig Machine 【TSP】
称号:Harry And Dig Machine 哈哈 最终涨边粉色了,不easy呀.顺便写一道题解吧 题意:给一个m*n的矩阵,然后当中最多由10个有值,求总左上角把全部的值都拿上回到左上角的最小 ...
- HDU - 5067 / HDU - 5418 TSP
集合表示多用[0,n)表示方法 HDU - 5067 经典TSP,每个顶点恰经过一次最优 #include<bits/stdc++.h> #define rep(i,j,k) for(in ...
- HDU 5067-Harry And Dig Machine(DFS)
Harry And Dig Machine Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- hdu 5067 遍历指定点集最小时间
http://acm.hdu.edu.cn/showproblem.php?pid=5067 贴题解 由于Harry的dig machine是无限大的,而装载石头和卸载石头是不费时间的,所以问题可以转 ...
随机推荐
- java环境配置,试用和基本数据结构
一.java环境配置 1.打开我的电脑--属性--高级--环境变量 2.新建系统变量JAVA_HOME 和CLASSPATH 变量名:JAVA_HOME 变量值:jdk文件所在的路经变量名:CLASS ...
- 响应式移动端去除css的hover和jq的hover还有input在苹果下的默认样式
去除css的hover: /*直接给body添加ontouchstart*/ <body ontouchstart> 去除jq的hover: var winW01 = $(window). ...
- STL的使用和背后数据结构
STL(Standard Template Library即,模板库)包括六个部分:容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adapter ...
- 008.Adding a model to an ASP.NET Core MVC app --【在 asp.net core mvc 中添加一个model (模型)】
Adding a model to an ASP.NET Core MVC app在 asp.net core mvc 中添加一个model (模型)2017-3-30 8 分钟阅读时长 本文内容1. ...
- localStorage和sessionStorage的使用方法和一些特性介绍
本文主要介绍的是localStorage和sessionStorage的使用方法和一些特性,以及一些其他的存储方式的比较. 客服端存储方案包括以下几种: 1.Cookie 2.Us ...
- Python中创建对象的方法
源引:Python编程实践 示例类: class Point: __slots__=('x','y') def __init__(self,x,y): self.x=x self.y=y def ma ...
- linux常用的监控命令
转自:http://www.cnblogs.com/huangxm/p/6278615.html 1. top 显示所有正在运行而且处于活动状态的实时进程, 而且会定期更新显示结果:它显示了CPU使 ...
- 有关Android插件化思考
最近几年移动开发业界兴起了「 插件化技术 」的旋风,各个大厂都推出了自己的插件化框架,各种开源框架都评价自身功能优越性,令人目不暇接.随着公司业务快速发展,项目增多,开发资源却有限,如何能在有限资源内 ...
- Spring AOP 和 动态代理技术
AOP 是什么东西 首先来说 AOP 并不是 Spring 框架的核心技术之一,AOP 全称 Aspect Orient Programming,即面向切面的编程.其要解决的问题就是在不改变源代码的情 ...
- openjudge8465:马走日 [搜索]
描述 马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. 输入 第一行为整数T ...