hdu 5067 遍历指定点集最小时间
http://acm.hdu.edu.cn/showproblem.php?pid=5067
贴题解
由于Harry的dig machine是无限大的,而装载石头和卸载石头是不费时间的,所以问题可以转化成:从某一点出发,遍历网格上的一些点,每个点至少访问一次需要的最小时间是多少。这就是经典的旅行商问题,考虑到我们必须要遍历的点只有不到10个,可以用状态压缩解决。
Dp[i][j]表示i状态的点被访问过了,当前停留在点j 需要的最少时间。枚举另一点不在i状态内的点k,从点j节点走向点k,状态转移
Dp[i|(1≪k)][k]=min(Dp[i|(1≪k)][k],Dp[i][j]+Dis(j,k))
其中Dis(j,k)表示点j与点k的最短距离,这个可以通过坐标O(1)计算得到。若有t个点包含石头,则算法复杂度为O(n∗m+(t2)∗(2t))。
状压dp即可
注意最后如果ans仍为INF说明可能是全0,需输出0,不然WA到死.
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
#define RD(x) scanf("%d",&x)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define clr0(x) memset(x,0,sizeof(x))
#define eps 1e-9
const double pi = acos(-1.0);
typedef long long LL;
const int modo = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int maxn = 55,maxm = 1e4 + 5;
int n,m,s[maxn][maxn];
int dp[11][1<<11];
typedef pair<int , int> p2;
p2 r[11];
int dis(p2 a,p2 b)
{
return abs(a.first - b.first) + abs(a.second - b.second);
}
void solve()
{
int mm = 0;
for(int i = 1;i <= n;++i)
for(int j = 1;j <= m;++j){
RD(s[i][j]);
if(s[i][j]){
r[mm++] = make_pair(i,j);
}
}
memset(dp,0x3f,sizeof(dp));
for(int i = 0;i < mm;++i){
dp[i][1<<i] = abs(r[i].first - 1) + abs(r[i].second - 1);
}
//freopen("1.txt","w",stdout);
for(int j = 1;j < (1<<mm);++j)
for(int i = 0;i < mm;++i)if(dp[i][j] != INF){
for(int k = 0;k < mm;++k){
if(0 == ((1<<k) & j)){
dp[k][j | (1<<k)] = min(dp[i][j] + dis(r[i],r[k]) , dp[k][j | (1<<k)]);
}
}
}
int ans = INF;
for(int i = 0;i < mm;++i){
ans = min(ans,dp[i][(1<<mm)-1] + abs(1 - r[i].first) + abs(1 - r[i].second));
}
if(ans == INF)
ans = 0;
printf("%d\n",ans);
return ;
}
int main() {
while(~RD2(n,m)){
solve();
}
return 0; }
hdu 5067 遍历指定点集最小时间的更多相关文章
- Python小代码_15_遍历指定路径下的所有文件和文件夹,并格式化输出文件路径文件名和文件夹名,文件大小,修改时间
遍历指定路径下的所有文件和文件夹,并格式化输出文件路径文件名和文件夹名,文件大小,修改时间 import osimport datetime def print_tree(dir_path): for ...
- hdu 5067 Harry And Dig Machine
http://acm.hdu.edu.cn/showproblem.php?pid=5067 思路:问题可以转化成:从某一点出发,遍历网格上的一些点,每个点至少访问一次需要的最小时间是多少.这就是经典 ...
- [WinAPI] API 13 [遍历指定目录 打印文件和其他属性]
Windows API中,有一组专门的函数和结构,用于遍历目录,它们是FindFirstFile函数.FindNextFile函数和WIN32_FIND_DATA结构.使用FindFirstFile和 ...
- hdu 5067 Harry And Dig Machine (状态压缩dp)
题目链接 bc上的一道题,刚开始想用这个方法做的,因为刚刚做了一个类似的题,但是想到这只是bc的第二题, 以为用bfs水一下就过去了,结果MLE了,因为bfs的队列里的状态太多了,耗内存太厉害. 题意 ...
- C#遍历指定文件夹中的所有文件(转)
原文链接:http://www.cnblogs.com/qianqianfy/archive/2009/07/08/1518974.html 1. C#遍历指定文件夹中的所有文件 DirectoryI ...
- C#遍历指定文件夹中的所有文件(转)
C#遍历指定文件夹中的所有文件 DirectoryInfo TheFolder=new DirectoryInfo(folderFullName);//遍历文件夹foreach(DirectoryIn ...
- HDU 5067 Harry And Dig Machine(状压DP)(TSP问题)
题目地址:pid=5067">HDU 5067 经典的TSP旅行商问题模型. 状压DP. 先分别预处理出来每两个石子堆的距离.然后将题目转化成10个城市每一个城市至少经过一次的最短时间 ...
- HDU - 5067 / HDU - 5418 TSP
集合表示多用[0,n)表示方法 HDU - 5067 经典TSP,每个顶点恰经过一次最优 #include<bits/stdc++.h> #define rep(i,j,k) for(in ...
- unix 下 shell 遍历指定范围内的日期
UNIX下遍历日期,date 没有 -d 的参数,所以需要自己处理. 下面使用时差的方法进行计算,遍历的日期是降序的 #!/usr/bin/ksh . $HOME/.profile timelag= ...
随机推荐
- float数据类型研究,发现其能显示的有效数字极为有限
1. 范围 float和double的范围是由指数的位数来决定的. float的指数位有8位,而double的指数位有11位,分布如下: float: 1bit(符号位) 8bits(指数位) ...
- 为什么要学习php
前言: 有的人说java是世界上最伟大的编程语言,也有人说php是最伟大的编程语言,对于这个问题的争论,貌似一直都没有停息过. 前段时间也看过一份编程语言使用排行的调查资料,java当仁不让的保持着排 ...
- JavaScript的控制语句和循环语句和函数的总结
10.控制语句---if语句 10_1:if-else语句 if(表达式){ 语句1: .... }else{ 语句1: .... }; 示例: var a = 1; if (a > 0){ a ...
- python之信号量【Semaphore】
# 互斥锁同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据,比如 # 一个厕所有3个坑,那么最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去 import ...
- Mac 终端使用 - 加密 1. MD5 2.Base64
1.MD5 打开终端 输入 :echo -n "加密内容" |md5 md5加密网站https://md5jiami.51240.com/ md5解密网站http://www.cm ...
- iOS 11 scroll滚动偏移,tableview偏移44,获取view的宽和高
1. tableview 的头部 有44的偏移量 1>.设置 tableview的 属性 tableView.scrollIndicatorInsets = UIEdgeInsets.zero ...
- js Function 函数
函数 var abs = function (x) { if (x >= 0) { return x; } else { return -x; } }; 函数体内部的语句在执行时,一旦执行到re ...
- Loitor_产品(一)
源码:https://github.com/loitor-vis/vi_sensor_sdk 注意:以下要一直在管理员权限 1.C++ 示例程序的编译步骤 先确认你的系统已经成功安装了OpenCV. ...
- C#控制台自定义背景颜色,字体颜色大全
效果: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...
- mysql自定义函数收集
代码: 查找字符串 in_string 中,存在多少个字符串 in_find_str delimiter $$ DROP FUNCTION IF EXISTS `fn_findCharCount` $ ...